bash: не нужно вызывать popd после pushd в конце скрипта?

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

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

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

pushd /etc
pushd /tmp

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

dirs

~

./example-pushd-twice.sh

/etc ~
/tmp /etc ~

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

dirs

~

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


person RocketNuts    schedule 09.02.2019    source источник


Ответы (1)


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

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

person Ondrej K.    schedule 09.02.2019