bashシェルでは、エイリアスを次のように設定して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
答え1
エイリアスは、シェルイベントがコードの解析を試みる前にシェルトークンを文字列に置き換える方法を定義します。関数のようなプログラミング構造ではありません。
存在する
alias pushd='pushd "$@" > /dev/null'
それから:
pushd .
pushd
結果は次に置き換えられ、次に解析されますpushd "$@" > /dev/null
。したがって、シェルは最終的に以下を解析します。
pushd "$@" > /dev/null .
リダイレクトはコマンドラインのどこにでも表示できるため、次のものとまったく同じです。
pushd "$@" . > /dev/null
または
> /dev/null pushd "$@" .
プロンプトでコマンドを実行したときに"$@"
シェルが受け取る引数のリストは、以下を実行しないと空白になるset arg1 arg2
ことがあります。
pushd . > /dev/null
しかし、関数の内部ではこれが"$@"
関数のパラメータになります。
pushd
ここでは、次の関数を定義したい場合があります。
pushd() { command pushd "$@" > /dev/null; }
または次のエイリアス:
alias pushd='> /dev/null pushd'
または
alias pushd='pushd > /dev/null