「コマンド」なしでcd(シェル関数)からcd(組み込み)を呼び出すと、無限ループが発生するのはなぜですか?

「コマンド」なしでcd(シェル関数)からcd(組み込み)を呼び出すと、無限ループが発生するのはなぜですか?

私はO'ReillyのBash本(私の要約)の1つで次を読んだことがあります。

コマンドとアクティブ化

cd () {
    echo "Improved CD !"
    # Improvement one;
    command cd
    # Improvement two;
    # Do cool stuff...
}
cd

commandこのコマンドは、組み込み関数を含む関数が組み込み関数と同じ名前を持つ場合に便利です。組み込み関数内の再帰ループを防ぎます。

私の質問は、関数を一度だけ呼び出すと、最初に再帰ループが表示されるのはなぜですか?

ベストアンサー1

試してみると

cd () {
    echo "Improved CD !"
    # Improvement one;
    cd
    # Improvement two;
    # Do cool stuff...
}
cd

いいえ command、関数がcd呼び出され、関数が関数を呼び出し、cd関数が関数をcd呼び出すようcdに、cd関数内の文は組み込み関数ではcdなく関数を呼び出します。cd端末で「改善されたCD!」が重複して繰り返されることがわかります。

最終結果はシェルによって異なります。 Zshが停止し(「最大ネストされた関数レベルに達しました」)、Bashがクラッシュします。

おすすめ記事