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
~

위의 셸 중 하나에서는 pushd현재 디렉터리를 디렉터리 스택에 푸시하고 터미널을 닫은 다음 새 터미널을 엽니다. 새 터미널에서는 이전에 푸시된 디렉터리가 스택에 없는 것을 볼 수 있습니다.

관련 정보