pushd/popdとsub-shell+cdの違い

pushd/popdとsub-shell+cdの違い

以下を使用すると、どのような利点があるかを理解しようとしています。

pushd my_dir
make all  # ... or something else
popd

そして

(
    cd my_dir
    make all  # ... or something else
)

それともこれは単に好みですか?

後者の表記には(他のフラグと一緒に)必要な問題があるかもしれませんが、set -eまだ最後のコマンドの終了コードを実行し、構文の面でより良く見えます。

答え1

サブシェルでスクリプトの一部を実行することは、必ずしも可能または有用ではありません。

私もスクリプトでpushd/を使用しますpopd(私は通常スクリプトでbashismを使用しているので大丈夫です)。しかし、私が理解しているように、これは主にインタラクティブシェルの便利な機能であり、サブシェルを使用することはそれほど面白いとは思わないでください。

答え2

pushd/popd読み込みは簡単ですが、スクリプトが途中で中断された場合(通常または強制)、変更されたCWDで終わるので安全ではありません。

サブシェルを使用すると、実行方法に関係なく元のCWDが保証されます。

Bash当初はPushd / popdを使用していましたが、今はできるだけ避けてください。それでもコマンドラインでは使用されますが、スクリプトでは使用されません。

スクリプトを作成するときは、常に最悪のシナリオ、つまり現在の行で実行が中断された場合に何が起こるかを検討してください。

関連情報