После запуска set -a var=99
я могу найти предложение в выводе set
:
...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_PROMPT=1
_=var=99
colors=/etc/DIR_COLORS
...
Кто-нибудь может сказать мне, что означает "_ ="?
Отмечу, что echo $var
ничего не даст. Если я запускаю set -a
, то set
эта переменная больше не будет включаться. Что происходит?
Ответы:
Когда вы выполняете
set -a var=99
, происходят три разные вещи (связанные с вашим вопросом):-a
) (обратное действиеset +a
) для экспорта переменных.$1
устанавливаются наvar=99
).$_
устанавливается на последний параметр (расширенный).установить -a
Выполнение
set -a
помечает все последующие (новые или измененные) переменные как экспортированные (во всех оболочках, кромеcsh
и некоторых связанных оболочек).Для того, чтобы оправиться от этого параметра, просто изменить
-
к+
:установить var = 99
Что должно быть
set -- var=99
на самом деле, чтобы избежать интерпретации опции (и set имеет много) со значениями, которые начинаются с тире (-
).Устанавливает список аргументов (список позиционных параметров) равным после
--
. Это действительно во всех разумных оболочках (не в csh et al). Позиционные аргументы печатаются с помощью «$ @» (или аналогичного «$ *», не равного)._ = Last_argument
И значение внутренней переменной оболочки
_
изменяется на последний аргумент выполненной строки. Это НЕ верно почти для всех оболочек (jsh, ash, yash, dash, lksh, mksh, ksh93, attsh и, конечно, csh и tcsh), за исключением bash.Обратите внимание, что значение в
$_
это значение после расширения:Вот почему, когда вы выполняете:
Вы получите описание переменной оболочки '$ _'. Это также работает:
источник
Подчеркивание на самом деле является специальной переменной оболочки. Здесь вы видите
_
переменную underscore ( ) со значениемvar=99
. Он доступен только для чтения и поддерживается оболочкой. Это:Ваш пример попадает во вторую категорию. Вы ввели:
Так последний аргумент был
var=99
, и это было значение вы настраивали (вы не настраивалиvar
к99
). Следовательно,_
был настроен на это. И вот что сообщается:Это немного сбивает с толку, но первое
=
указывает на присвоение переменной_
, а второе является частью значения.Также стоит упомянуть, что эта
-a
опцияset
приведет к экспорту всех определенных впоследствии переменных .источник
Правильный ответ будет зависеть от используемой вами оболочки:
bash
все, что сказал @BobEager, применимоzsh
него задается только последний аргумент предыдущей команды и полный путь к команде в среде командыdash
только устанавливают эту переменную при запуске интерактивного сеансаМогут быть и другие особенности в других оболочках. Как таковой,
$_
он не определен в POSIX, поэтому следует учитывать потенциальные проблемы переносимости при его использовании.Примечание: если вы намерены присвоить значение 99
var
и сделать его доступным в среде последующих подпроцессов, правильный синтаксис для достижения этого:источник
unset var;set -a; var=99
. Работает во всех резонирующих оболочках (не csh и др.).В не очень мелкий шрифт Баш (1) , мы находим
Это означает,
set -a var=99
что не устанавливает переменную окруженияvar
в99
; это устанавливает$1
кvar=99
. Попробуйтеecho "$1"
или,echo "$*"
и вы увидите.источник