bash: нет необходимости вызывать popd после pushd в конце скрипта? - PullRequest
0 голосов
/ 10 февраля 2019

У меня были некоторые проблемы с выполнением надлежащей «очистки pushd / popd» в моем скрипте bash.То есть: если я сделал pushd несколько раз, я хотел убедиться в том, чтобы сделать то же самое число popd до exit.

Однако я заметил, что стек pushd / popd не 't кажется глобальным.

Предположим, у меня есть этот скрипт с именем example-pushd-twice.sh в моем homedir:

pushd /etc
pushd /tmp

И я делаю это из оболочки из моего homedir: (в результате получается выводцитаты)

dirs

~

./example-pushd-twice.sh

/ etc ~
/ tmp/ etc ~

Теперь я ожидал, что все еще буду в /tmp и все еще буду иметь стек Dir с 3 папками, однако:

dirs

~

Это правильное поведение?Могу ли я доверять сценарию оболочки для вызова своего собственного стека pushd / popd, поэтому мне не нужно заботиться об очистке после этого?

1 Ответ

0 голосов
/ 10 февраля 2019

Стек каталога исчезает при выходе из оболочки (интерпретатора вашего скрипта).Это то же самое поведение, которое вы получите, если бы вы запустили /bin/bash из вашей интерактивной оболочки.Сделал pushd /tmp.А потом набрал exit.Оболочка, в которую вы возвращаетесь, не зависит от того, что происходило внутри этого другого bash процесса.

Однако в ситуации, когда вы используете исходный сценарий (то есть вместо этого запускаете команды в текущем bash процессе)его выполнения (создание нового экземпляра оболочки) стек каталогов все еще будет задерживаться после завершения последней строки исходного файла.Вместо ./example-pushd-twice.sh запустите source ./example-pushd-twice.sh и наблюдайте разницу.По этой причине, если вы полагаетесь на pushd в своем скрипте, все равно будет разумно popd до его завершения.

...