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 …

  • August 15, 2019

我在我的 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

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