web-dev-qa-db-ja.com

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

私は使用することの利点があるかどうかを理解しようとしています:

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

vs

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

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

後者の表記には、set -e(および他のフラグ)が必要になるなどの問題があると思いますが、それでも最後のコマンドの終了コードを実行し、構文の点で見栄えがします。

1

スクリプトの一部をサブシェルで実行することが常に可能または有用であるとは限りません。

私はスクリプトでもpushd/popdを使用します(とにかくスクリプトには通常バシズムがあるので問題ありません)が、私の理解では、これは主にインタラクティブシェルの便利な機能です、およびサブシェルを使用すると、楽しいことが期待されるべきではありません。

3
Hauke Laging

pushd/popdは読みやすいですが、スクリプトが途中で(通常または強制的に)中断されると、CWDが変更されるため、安全ではありません。

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

Bashの初期の頃は、pushd/popdを使用していましたが、現在は可能な限りそれらを避けています。私はまだコマンドラインでそれらを使用していますが、スクリプトでは使用していません。

スクリプトを作成するときは、常に最悪のケースについて考えてください。現在の行で実行が中断した場合に何が起こる可能性があるかです。

1
sorin