Bash
@inaliasinsid_escript:isthere’local’_@一世n一種l一世一種s一世ns一世d和sCr一世p噸:一世s噸H和r和一種’l這C一種l’@ in alias inside script: is there a …
我在我的 bash shell 中有如下別名
pushd
,以便它抑制輸出:alias pushd='pushd "$@" > /dev/null'
這在大多數情況下都可以正常工作,但是我現在在帶參數的函式中使用它時遇到了麻煩。例如,
test() { pushd . ... }
test
不帶參數執行很好。但有論據:> test x y z bash: pushd: too many arguments
我認為它
pushd
試圖. x y z
作為論據而不是僅僅.
. 我怎樣才能防止這種情況?是否有一個“本地”等價物$@
只能看到.
而不是x y z
?
別名定義了一種在 shell 事件嘗試解析程式碼之前用某個字元串替換 shell 標記的方法。它不是像函式那樣的程式結構。
在
alias pushd='pushd "$@" > /dev/null'
進而:
pushd .
發生的事情
pushd
是替換為pushd "$@" > /dev/null
然後解析結果。所以shell最終解析:pushd "$@" > /dev/null .
重定向可以出現在命令行的任何位置,因此它與以下內容完全相同:
pushd "$@" . > /dev/null
或者
> /dev/null pushd "$@" .
當您從提示符執行它時,
"$@"
是您的 shell 收到的參數列表,因此除非您執行set arg1 arg2
,否則它可能是空的,因此它與pushd . > /dev/null
但是在函式中,這
"$@"
將是函式的參數。在這裡,您要麼想定義
pushd
為如下函式:pushd() { command pushd "$@" > /dev/null; }
或類似的別名:
alias pushd='> /dev/null pushd'
或者
alias pushd='pushd > /dev/null