簡體   English   中英

Bash:將別名或函數作為參數傳遞給程序

[英]Bash: Pass alias or function as argument to program

我經常需要處理目錄中的最新文件。

通常我會:

ls -rt

然后在vim或更少的文件中打開最后一個文件。

現在我想產生一個別名或函數,例如

lastline() {ls -rt | tail -n1}
# or
alias lastline=$(ls -rt | tail -n1)

調用lastline將輸出目錄中的最新文件,這很好。 但是打電話

less lastline

想要打開不存在的文件“ lastline”。

我如何使bash執行函數或別名,如果可能的話,無需大量輸入$()或``? 還是有其他方法可以達到相同的結果?

謝謝你的幫助。

您正在解析ls ,這非常糟糕。 此外,如果最后一次修改的“文件”是一個目錄,你會less ING / vim荷蘭國際集團的目錄。

因此,您需要一種可靠的方法來確定當前目錄中最后修改的文件。 您可以使用如下幫助程序功能(將其放入.bashrc ):

last_modified_regfile() {
    # Finds the last modified regular file in current directory
    # Found file is in variable last_modified_regfile_ret
    # Returns a failure return code if no reg files are found
    local file
    last_modified_regfile_ret=
    for file in *; do
        [[ -f $file ]] || continue
        if [[ -z $last_modified_regfile_ret ]] || [[ $file -nt $last_modified_regfile_ret ]]; then
            last_modified_regfile_ret=$file
        fi
    done
    [[ $last_modified_regfile_ret ]]
}

然后,您可以定義另一個函數,將對最近找到的文件進行vim處理:

vimlastline() {
    last_modified_regfile && vim -- "$last_modified_regfile_ret"
}

您甚至可以讓last_modified_regfile帶有可選參數:它將在其中找到最后一個修改后的常規文件的目錄:

last_modified_regfile() {
    # Finds the last modified regular file in current directory
    # or in directories given as arguments
    # Found file is in variable last_modified_regfile_ret
    # Returns a failure return code if no reg files are found
    local file dir
    local save_shopt_nullglob=$(shopt -p nullglob)
    shopt -s nullglob
    (( $# )) || set .
    last_modified_regfile_ret=
    for dir; do
        dir=${dir%/}
        [[ -d $dir/ ]] || continue
        for file in "$dir"/*; do
            [[ -f $file ]] || continue
            if [[ -z $last_modified_regfile_ret ]] || [[ $file -nt $last_modified_regfile_ret ]]; then
                last_modified_regfile_ret=$file
            fi
        done
    done
    $save_shopt_nullglob
    [[ $last_modified_regfile_ret ]]
}

然后,您甚至可以相應地更改vimlastline

vimlastline() {
    last_modified_regfile "$@" && vim -- "$last_modified_regfile_ret"
}

使用如下命令替換:

lastline() { ls -rt | tail -n1; }
less "$(lastline)"

或將其通過管道傳遞給xargs

lastline | xargs -I {} less '{}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM