必要に応じて、cd
コマンドの機能をカスタマイズしたい。
次の関数を定義しました-function cd () { cd "$@" && pushd "$@"; }
この関数の目的は、ディレクトリをスタックに自動的にプッシュして、毎回手動でpushd .
を入力する手間を省くことです。
ただし、上記の関数は無限に再帰的な関数です。cd
への呼び出しは、cd
組み込み関数ではなく関数自体として解釈されるためです。
この関数で組み込みのcd
を参照するにはどうすればよいですか?
エイリアスは\
を使用してエスケープできることを知っています。より明示的な方法で関数をエスケープするか、組み込みを参照する方法は何ですか?
注:関数の名前を他の名前に変更したくありません。
command
ビルトインは、コマンド名をビルトインまたは外部コマンドとして解釈するように強制します(エイリアスと関数ルックアップをスキップします)。 bashを含むすべてのPOSIXシェルで使用できます。
cd () { command cd "$@" && pushd "$@"; }
(この例は悪い例であることに注意してください。これは相対パスでは機能せず、最初にpushd
と入力することもできます。)
Bashおよびzsh(kshではない)では、builtin
を使用して、エイリアス、関数、および外部コマンドを除いて、コマンド名を組み込みとして解釈させることができます。
Bashには(ビルトイン)コマンドbuiltin
があり、これはまさに必要なことを行います。関数内でcd
をbuiltin cd
に置き換えると、再帰が修正されます。
「関数の名前を他の名前に変更したくない」と言ったとき、元のコマンドと同じ名前で関数を呼び出せるようにしたいのではないでしょうか。
したがって、組み込みでないものでも機能する別の方法は、関数に別の名前を付け、ラップされたコマンドのエイリアスを定義することです。これは、エイリアスが関数の実行コンテキストに存在しないため機能します。
Wrapper.shの例:
#!/bin/bash
function my_wrapper() { wrapped_program $@ && dostuff }
そして、例えば、.bash_aliases:
source /path/to/wrapper.sh
alias wrapped_program="my_wrapper"
しかし、これはかなりハッキーです。可能であれば、command
を使用することをお勧めします。