Bashスクリプトのディレクトリスタック(pushdとpopd)の動作

Bashスクリプトのディレクトリスタック(pushdとpopd)の動作

잘못 작성했지만 pushd /etc완료하지 못했다 면 어떻게 되나요 popd? 스크립트 실행이 끝나고 Bash가 종료된 후에도 해당 스크립트는 /etc여전히 pushd+ popd디렉터리 스택/RAM에 남아 있나요?bash

수동으로 지우지 않고 터미널 에뮬레이터 세션(해당 터미널 에뮬레이터 세션에 대한 셸 프로세스를 종료해야 함)을 닫으면 pushd+directory 스택이 popd지워지나요(변수와 마찬가지로)?bashpopd

答え1

pushdコマンドpopdで使用されるディレクトリスタックは、bash現在のシェルにローカルなディレクトリスタックです。つまりpopd、スクリプト内で使用しないと、スクリプト外のディレクトリスタックには影響しません。

ターミナルが閉じると(シェルが終了します)、スタックはクリアされます。

新しいシェルを起動するたびに、デフォルトでディレクトリスタックも空ですbash

答え2

質問に対する答えを見つけるためにいくつかの簡単な実験を行うことができます。時には、新しいツールを学ぶための最良の方法は、自分で試してみることです。

pushd /etc を使用するスクリプトを作成したが popd で終わらない場合: Bash スクリプトが実行を完了し、Bash が終了した後でも /etc はまだ pushd+popd ディレクトリスタック/RAM にありますか?

$ cd /tmp
$ echo 'pushd /etc' > experiment.sh
$ bash experiment.sh
/etc /tmp
$ pwd
/tmp
$

上記は間違ってexperiment.sh書かれたスクリプトです。pushd現在のディレクトリをスタックにプッシュし、そのディレクトリに切り替えて終了するために使用されます/etc/。スクリプトが終了した後も実行中のシェルは/tmp

popdを使用して手動でクリアせずにターミナルエミュレータセッション(そのターミナルエミュレータセッションのBashシェルプロセスを終了する必要があります)を閉じると、pushd + popdディレクトリスタックも変数のように消去されますか?

$ cd /tmp
$ pushd /etc
/etc /tmp
$ dirs
/etc /tmp
-- close terminal --
-- open new terminal --
$ dirs
~

上記のシェルの1つでは、pushd現在のディレクトリをディレクトリスタックにプッシュして端末を閉じてから、新しい端末を開きます。新しい端末では、以前にプッシュされたディレクトリがスタックにないことがわかります。

関連情報