Command-Line

如何評估別名中的多個參數?

  • August 12, 2021

我正在嘗試創建一個使用帶有完整路徑的參數的簡單別名

在命令行上,我可以輸入command "$(pwd)/my_file". 有用。所以我嘗試通過以下方式創建別名:

alias command='command "$(pwd)/$1"'

這個別名不起作用。CLI 解釋為好像是單獨$(pwd)my_file參數……我試圖使用該eval命令將我的命令變成一個單一的

alias command="eval 'command' '$(pwd)/$1'"

但是,它一直在等待輸入參數,而不是接受我的初始參數……

如果您想嘗試我的意思,請替換commandevince流行的 PDF 查看器)和my_file任何 PDF 文件。所以我的別名是

alias evince="evince $(pwd)/$1"

就我而言,$(pwd)is/home/tapyu/Downloads/my_fileis recap.pdf。我知道 evince 將其視為一個單獨的參數,因為它會彈出兩個視窗:第一個視窗recap.pdf正確打開。第二個是帶有警告的空視窗"Error opening file, /home/tapyu/Downloads/ is a directory."

先感謝您。

PS:我知道這個“問題”是沒有意義的。我的問題不是“如何給出命令的完整路徑”,我的問題是“如何處理別名中的輸入參數以解決這種情況”。所以不想提供完整路徑的替代品,我想知道為什麼我的別名不起作用。

第一個問題是別名不帶參數。如果您需要將參數傳遞給別名,則意味著您應該改用函式。你可以看到如果你執行會發生什麼set -x

$ alias evince="evince $(pwd)/$1"
$ set -x
$ evince a.pdf
+ evince /home/terdon/foo/ a.pdf

如您所見,命令evince a.pdf變為evince /home/terdon/foo/ a.pdf(我在目錄中執行它/home/terdon/foo/)。那麼這裡發生了什麼?看看你的別名實際上是什麼:

$ type evince
evince is aliased to `evince /home/terdon/foo/'

如果您執行set -x然後定義別名,您甚至可以看到這種情況:

$ alias evince="evince $(pwd)/$1"
++ pwd
+ alias 'evince=evince /home/terdon/foo/'

當您定義別名時,$1沒有任何值,並且pwd在設置別名之前執行,因此您實際上別名為evince /home/terdon/foo/. 然後,當你執行時evince a.pdf,它實際上執行了evince /home/terdon/foo/ a.pdf,這就是你得到兩個視窗的原因。

一個函式看起來像這樣:

evince(){
   command evince "$(pwd)"/"$1"
}

注意command: 的使用是為了確保evince函式內部會遞歸呼叫命令而不是函式本身。 evince另請注意,這是一個毫無意義的範例,因為evince foo它本身與evince $(pwd)foo. 如果文件位於目前目錄中,則不需要文件的完整路徑。

引用自:https://unix.stackexchange.com/questions/663888