スクリプト内のエイリアスに$ @: "ローカル" $ @がありますか?

スクリプト内のエイリアスに$ @: "ローカル" $ @がありますか?

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

関連情報