Почему 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 .
  • Как получить переменную среды из имени строки в KSH
  • Что это за синтаксис Bash: someVariable = someValue
  • Отправьте команду на выполняемый сеанс tmux (например, screen -X)
  • Является ли переменная среды $ HOME всегда заданной в системе Linux?
  • Как избежать предупреждений из подоболочек, если функция в PROMPT_COMMAND не определена?
  • Вопрос об экологической переменной
  • HOME не устанавливается при использовании уязвимости
  • sudo как другой пользователь с их окружением
  • Могу ли я установить несколько каталогов для $ HOME?
  • Передавать значения переменных среды в программу?
  • Хранение списка в переменной
  • Linux и Unix - лучшая ОС в мире.