関数内のエイリアスが機能しないのはなぜですか? [コピー]

関数内のエイリアスが機能しないのはなぜですか? [コピー]

以下のコードをご覧ください。

a()(alias x=echo\ hi;type x;alias;x);a

関数の内部にエイリアスがあり、外部環境を変更したくありません(したがって()代わりに使用します{})。コードのエイリアスが正常に設定されていることを示しても機能しません。出力を確認してください。

x is aliased to `echo hi'
...
alias x='echo hi'
x: command not found

これが効果があると聞いたが効果がないだけでなく、そんな作業をしているのでshopt -s expand_aliases頼ることができません。bashdd-wrtbusyboxash

この問題について知っている人はいますか?

ベストアンサー1

私はそれを使用しませんが、マニュアルにはエイリアスについて次のように記載されていますdashbash

エイリアスの定義と使用に関する規則は多少混乱しています。 Bash は、その行からコマンドを実行する前に、常に入力の行全体を 1 つ以上読みます。。エイリアスは、コマンドの実行時ではなく、コマンドの読み込み時に拡張されます。したがって、他のコマンドと同じ行に表示されるエイリアス定義は、次の入力行を読むまで適用されません。 この行のエイリアス定義の後に続くコマンドは、新しいエイリアスの影響を受けません。。この動作は関数の実行時にも問題になります。関数定義自体が複合コマンドであるため、関数が実行されるのではなく、関数定義を読み取るとエイリアスが拡張されます。したがって、関数で定義されたエイリアスは、関数が実行された後にのみ使用できます。安全のために、常に別名定義を別々の行に配置し、複合コマンドに別名を使用しないでください。

今回はzshマニュアルのもう一つの引用です。

次のコードは、一般的なエイリアシングの問題を示しています。

          alias echobar='echo bar'; echobar

echobarコマンドが見つからないというメッセージが表示されます。これは、コードを読み取るとエイリアスが拡張されるために発生します。ため息の全行を読むechobar実行時に新しく定義されたエイリアスを拡張するには遅すぎます。 sourceこれは通常、以下を使用または実行するシェルスクリプト、関数、およびコードで発生する問題です。 .。したがって、非対話型コードでは、エイリアスの代わりに関数を使用することをお勧めします。

他のシェルにも同様の状況があると確信しています。

おすすめ記事