Bash 関数/エイリアス名の衝突によりセグメント エラーが発生する

Bash 関数/エイリアス名の衝突によりセグメント エラーが発生する

この投稿の問題は私にも起こりました。 mkdir が bash をクラッシュさせる

評判がないのでコメントできませんでした。なぜこれが起こるのか説明できる人はいますか? 関数がロードされたときではなく、実行時に発生します。同じ問題の貼り付けを以下に示します。

md() 
{  
    [ $# -eq 0 ] && { echo "$0 dirname [permissions]"; return; }
    [ -d "$1" ] && { echo "%1 already exists!"; return; }
    mkdir -m ${2:-0755} -p "$1"
}

「問題は、以前に alias md="mkdir" のようなエイリアスを使用していたため、bash が新しい bash 関数を解析したときに、md() が mkdir() に拡張され、関数が無限再帰になり、シェルがクラッシュしたことです。」

この問題は適切に見つかったと感じましたが、その理由がわかりません。エイリアスの展開が完全修飾シェル関数を誤って指示する理由がわかりません。逆ですよね?

重複して申し訳ありません。呼びかける前に理由を読んでください。

答え1

md() { ... }「エイリアスは実際には単なるテキスト置換マクロです。したがって、定義後に定義しようとすると、md=mkdir実際には になりますmkdir() { ... }。 と を含む関数定義を印刷してdeclare -p -f mddeclare -p -f mkdir私の言っていることを理解してみてください。」 – steeldriver

zi@zi-top:~$ declare -p -f nd
bash: declare: nd: not found
zi@zi-top:~$ declare -p -f mkdir
mkdir () 
{ 
    mkdir -p "$@"
}
zi@zi-top:~$ nd () {
        mkdir -p "$@"
}
zi@zi-top:~$ declare -p -f nd
bash: declare: nd: not found

steeldriver の言ったことは本当だとわかりました。これは奇妙なアーキテクチャ上の決定で、おそらくコード内の何らかの推論がテキスト バシズム wurl であると思います。ありがとうございます!

関連情報