Я согласен, это не очень понятно.
1. При запуске оболочки,
если _переменная была в среде, bashполученной , а затем bashостаются нетронутыми.
В частности, если bashоболочка была вызвана другой bash
оболочкой (хотя zsh, yashи некоторые kshреализации также сделать это), то , что bashоболочка будет установить _переменную окружения пути выполняемой команды (это третий пункт в вашем вопросе). Например, если bashвызывается для интерпретации сценария в результате другой bashинтерпретации оболочки:
bash-script some args
Это bashбудет проходить _=/path/to/bash-scripв заданной среде bash-script, и именно это будет первоначальное значение $_ bashпеременной в bashоболочке, которая интерпретирует этот скрипт.
$ env -i _=whatever bash -c 'echo "$_"'
whatever
Теперь, если приложение ссылающееся не пропускает _переменное окружение , вызванная bashоболочка инициализируется $_в argv[0]получении себя , который может быть bash, или /path/to/bashили
/path/to/some-scriptили что - нибудь еще (в приведенном выше примере, что будет , /bin/bashесли она-бах сценария был #! /bin/bash
или в /path/to/bash-script зависимости от системы ).
Таким образом, этот текст вводит в заблуждение, поскольку он описывает поведение вызывающей стороны, которая не bashимеет никакого контроля. Вызванное приложение
bashможет очень хорошо не устанавливаться $_вообще (на практике, execlp()например, это делают только некоторые оболочки и несколько редких интерактивных приложений ), или оно может использовать его для чего-то совершенно другого (например, ksh93устанавливает его *pid*/path/to/command).
$ env bash -c 'echo "$_"'
/usr/bin/env (env did not set it to /bin/bash, so the value we
get is the one passed to env by my interactive shell)
$ ksh93 -c 'bash -c "echo \$_"'
*20042*/bin/bash
2. Впоследствии
Впоследствии не очень понятно , либо. На практике это происходит, как только bashинтерпретируется простая команда в текущей среде оболочки.
В случае интерактивной оболочки это будет, например, первая простая команда, интерпретируемая из /etc/bash.bashrc.
Например, по приглашению интерактивной оболочки:
$ echo "$_"
] (the last arg of the last command from my ~/.bashrc)
$ f() { echo test; }
$ echo "$_"
] (the command-line before had no simple command, so we get
the last argument of that previous echo commandline)
$ (: test)
$ echo "$_"
] (simple command, but in a sub-shell environment)
$ : test
$ echo "$_"
test
Для неинтерактивной оболочки это будет первая команда $BASH_ENVили код, переданный в эту оболочку, если $BASH_ENVона не установлена.
3. Когда Bash выполняет команду
Третий момент - это нечто иное, и намекается в обсуждении выше.
bashПодобно нескольким другим оболочкам, передаваемым _командам передается переменная окружения, содержащая путь, который bashиспользуется в качестве первого аргумента для execve()системных вызовов.
$ env | grep '^_'
_=/usr/bin/env
4. При проверке почты
Четвертый пункт описан более подробно в описании MAILPATHпеременной:
'MAILPATH'
Разделенный двоеточиями список имен файлов, который оболочка периодически проверяет на наличие новой почты .
Каждая запись в списке может указывать сообщение, которое печатается при поступлении новой почты в почтовый файл , отделяя имя файла от сообщения знаком «?». При использовании в тексте сообщения «$ _» расширяется до имени текущего почтового файла.
Пример:
$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>