Почему bash очищает OLDPWD при запуске дочернего скрипта?

OLDPWD экспортируется и передается любым дочерним элементам, но bash, по-видимому, очищает OLDPWD всякий раз, когда запускается дочерний скрипт:

$ cd /etc $ cd $ perl -e 'print "<$ENV{OLDPWD}>\n"' </etc> $ ksh -c 'echo "<$OLDPWD>"' </etc> $ bash -c 'echo "<$OLDPWD>"' <> 

Любой способ обойти это, кроме создания псевдонима или усечения дочернего скрипта или экспорта какой-либо другой переменной с тем же значением, когда я хочу использовать $ OLDPWD в дочернем скрипте?

** ОБНОВЛЕНИЕ 2015/11/26 **

Я подал отчет об ошибке bash и получил этот ответ от Чет Рами, помощника по bash:

Почему bash очищает OLDPWD при запуске дочернего скрипта?

Потому что новая оболочка не имеет «предыдущего рабочего каталога». Он должен быть установлен cd, и если вы не выполнили cd, у вас его нет.

Кажется разумным наследовать OLDPWD, если он называет каталог, так же, как оболочка наследует PWD, если он называет текущий каталог, поэтому мы попробуем это для следующей версии bash.

One Solution collect form web for “Почему bash очищает OLDPWD при запуске дочернего скрипта?”

Вероятно, это оставленное поведение давно, когда bash впервые внедрил OLDPWD . OLDPWD выпуске для bash 2.03 alpha (в 1999 году) показывают, что OLDPWD ранее не являлась экспортируемой переменной. Если он не был экспортирован, он не будет унаследован дочерним процессом.

Судя по комментарию этого фрагмента от источника Баша, поведение преднамеренно:

  /* According to the Single Unix Specification, v2, $OLDPWD is an `environment variable' and therefore should be auto-exported. Make a dummy invisible variable for OLDPWD, and mark it as exported. */ temp_var = bind_variable ("OLDPWD", (char *)NULL, 0); VSETATTR (temp_var, (att_exported | att_invisible)); 

Хотя примечание о выпуске указывает, что его экспорт был выполнен для выполнения POSIX.2, OLDPWD не отображается в списке переменных оболочки для оболочки POSIX. Он появляется в описании cd . Это не означает, что исходное значение должно быть получено из родительского процесса; нет конкретного поведения, которое требуется.

Он не является документированной особенностью bash; есть несколько комментариев, которые можно найти:

  • Потеря OLDPWD в Erlang на MacOSX
  • … «OLDPWD not set» … , указывая, что изначально у дочерней оболочки нет предварительной команды cd для установки $OLDPWD .
  • Как установить SHELL = / bin / bash глобально для cron
  • Bash: Сколько вложенных сеансов в глубину?
  • set + a не отменяет флаг -a
  • Как запустить скрипт сразу после подключения через SSH?
  • Как я могу сохранить * all * environment vars для определенной команды в sudo?
  • изменить местоположение файла .sqlite_history
  • Как установить переменную среды для sudo в MacOS?
  • Установка пакетов и инструментов в локальном нестандартном каталоге
  • Как исправить правильные сценарии запуска в интерактивной оболочке без входа
  • Обнаружение X-сессии в сценарии bash (.bashrc и т. Д.)
  • Передавать значения переменных среды в программу?
  • Linux и Unix - лучшая ОС в мире.