Руководство Bash говорит (manpage, мой акцент):
Когда Bash вызывает внешнюю команду, для переменной
$_
задается полный путь к команде и она передается этой команде в своем окружении.
И ( специальные параметры ):
_
(
$_
подчеркивание.) При запуске оболочки задайте абсолютный путь, используемый для вызова оболочки или сценария оболочки, который выполняется, как передано в среде или списке аргументов. Затем расширяется до последнего аргумента предыдущей команды после расширения. Также задайте полный путь, используемый для вызова каждой команды, выполненной и помещенной в среду, экспортированную в эту команду. При проверке почты этот параметр содержит имя почтового файла.
В оболочке bash я запускаю:
$ bash $ export | grep '_='
Согласно инструкции,
_
должна быть переменная окружения новой оболочки bash.export
должен выводить все переменные окружения новой оболочки bash, но не выводить_
. Поэтому мне интересно,_
является ли переменная окружения новой оболочки bash?На самом деле в любой оболочке bash происходит то же самое
$ export | grep '_='
ничего не выводит. Так что мне интересно,
_
является ли когда-нибудь переменная окружения оболочки bash?Для сравнения:
$ dash $ export | grep '_=' export _='/bin/dash'
Мой пост вдохновлен комментарием Майка и ответом Стефана .
export
является встроенным, но если вы используетеprintenv _
, он покажет вам, как он был вызван:/usr/bin/printenv
в этой системе.bash -c export | grep _=
(с Bash), будет показано , как родительские оболочки применятbash
команду, даже если$_
она не задано в родительском.Ответы:
Да,
_
это переменная окружения новой оболочки Bash; Вы можете увидеть это, запустиввнутри оболочки: показывает содержимое начальной среды оболочки. Вы не увидите его в первой оболочке, потому что не было предыдущей оболочки, чтобы установить ее до ее запуска.
Расширение
$_
внутри Bash относится к_
специальному параметру, который расширяется до последнего аргумента предыдущей команды. (Внутренне Bash обрабатывает это, используя_
переменную оболочки, которая обновляется при каждом анализе команды, но на самом деле это деталь реализации. Она «не экспортируется» каждый раз, когда анализируется команда. )export
Не отображается,_
потому что это не так переменная, помеченная как экспортированная; однако вы можете увидеть это в выводеset
.В первом примере, новые разборы оболочки Bash и выполняют команды в своих стартовых файлах, поэтому при запуске
explore | grep '-='
,_
уже переписаны и помечены как не экспортируются.В этом
dash
примере кажется, что он не выполняет ни одного загрузочного файла, поэтому вы видите переменную как переменную среды, которая была установлена Bash перед запускомdash
.источник
export | grep '_='
выводится? Почему в исходной оболочке bash ничего неtr '\0' '\n' < /proc/$$/environ | grep _=
выводится?_
выбрасывается из окружающей среды , и как я могу экспортировать его обратно в окружающую среду ?export
без аргументов перечисляет все экспортируемые переменные ._
не является переменной, но указан в качестве специального параметра .Несколько сбивает с толку,
_
также будет допустимым именем для переменной , в отличие от имен других специальных параметров. По крайней мере, Bash 4.4 позволяет назначений на него, без нареканий. Это просто бесполезно, потому что специальный эффект немедленно переопределяет значение.источник
_
в качестве переменной, хотя ;-). Это эффективно только для записи, и значение немедленно теряется._
как переменная, поэтому она отображается в выходных данныхset
. Однако он не может быть помечен как экспортированный, насколько я могу определить.Не все переменные оболочки помечены как экспортированные, как вы можете видеть в выводе
declare -p
.Не имеет смысла
bash
помечать$_
как экспортированные, потому что он автоматически добавляет эту переменную в среду дочерних процессов, но имеет значение, отличное от того, которое имеет в оболочке (на данный момент).Отображение его как экспортированного просто запутает пользователя в том, что произойдет со средой внешних команд.
Все «переменные времени выполнения»
BASH*
не экспортируются.источник