バッシュマニュアルから
関数定義自体が複合コマンドであるため、関数が実行されるのではなく、関数定義を読み取るとエイリアスが拡張されます。したがって、関数で定義されたエイリアスは、関数が実行された後にのみ使用できます。安全のために、常に別名定義を別の行に入力してください。複合コマンドにエイリアスを使用しないでください。。
わかりました。関数定義にエイリアスを使用すると、いくつかの潜在的な問題があります。、まだいくつかの質問がありますが、関数定義を実行して関数を呼び出すときに、次のうち関数本文内で実行されるシェル操作は何ですか?。
しかし、なぜ「複合コマンドにエイリアスを使用しないでください」は、関数定義から汎用複合コマンドに一般化されるのですか?
エイリアシングの問題が発生する可能性がある他の種類の複合コマンドは何ですか?
答え1
しかし、なぜ「複合コマンドにエイリアスを使用しないでください」は、関数定義から汎用複合コマンドに一般化されるのですか?
正反対です(bashマニュアル抜粋は不完全です)。複合コマンドは、複合コマンドである機能定義に要約されます。
複合コマンドは読み出された直後に実行されます。エイリアスは、読み取り時間ではなく実行時間で定義されます(明らかに)。ただし、エイリアス置換は、コマンドを読み取る場合にのみ発生します。
次の複合コマンドを例にします。
$ alias echo='echo Follow my advice:' &&
> echo Alias is a basic substitution mechanism
Alias is a basic substitution mechanism
$ echo Use aliases sparingly
Follow my advice: Use aliases sparingly
&&
まず、複合コマンドの導入により、シェルが何もせずに2行目の入力を求めるメッセージが表示されます。
この2行の複合コマンド読む、コマンドを実行する前にエイリアスを置き換えます。このように変更すると、echo
エイリアスはまだ存在しないため、何も変わりません。最後に、エイリアス定義の後に来ても、コマンド全体が実行されるときにecho
使用される組み込みコマンドです。
echo
2番目のコマンドが次の場合読むこの場合、エイリアスecho
が存在し置換されます。したがって、実行されるコマンドはですecho Follow my advice: Use aliases sparingly
。
関数定義はより大きな複合コマンドですが、機能は同じです。すべての内部エイリアス定義は、関数が呼び出されたときにのみ適用されます。