如何評估別名中的多個參數?
我正在嘗試創建一個使用帶有完整路徑的參數的簡單別名
在命令行上,我可以輸入
command "$(pwd)/my_file"
. 有用。所以我嘗試通過以下方式創建別名:alias command='command "$(pwd)/$1"'
這個別名不起作用。CLI 解釋為好像是單獨
$(pwd)
的my_file
參數……我試圖使用該eval
命令將我的命令變成一個單一的alias command="eval 'command' '$(pwd)/$1'"
但是,它一直在等待輸入參數,而不是接受我的初始參數……
如果您想嘗試我的意思,請替換
command
(evince
流行的 PDF 查看器)和my_file
任何 PDF 文件。所以我的別名是alias evince="evince $(pwd)/$1"
就我而言,
$(pwd)
is/home/tapyu/Downloads/
和my_file
isrecap.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
. 如果文件位於目前目錄中,則不需要文件的完整路徑。