Не могли бы вы объяснить следующие предложения из руководства Bash $_
, особенно о выделенных полужирным шрифтом частях, возможно, с некоторыми примерами?
При запуске оболочки задайте абсолютный путь, используемый для вызова оболочки или сценария оболочки, который выполняется, как передано в среде или списке аргументов .
Впоследствии расширяется до последнего аргумента предыдущей команды после расширения.
Также задайте полный путь, используемый для вызова каждой команды, выполненной и помещенной в среду, экспортированную в эту команду .
При проверке почты этот параметр содержит имя почтового файла.
Ответы:
Я согласен, это не очень понятно.
1. При запуске оболочки,
если
_
переменная была в среде,bash
полученной , а затемbash
остаются нетронутыми.В частности, если
bash
оболочка была вызвана другойbash
оболочкой (хотяzsh
,yash
и некоторыеksh
реализации также сделать это), то , чтоbash
оболочка будет установить_
переменную окружения пути выполняемой команды (это третий пункт в вашем вопросе). Например, еслиbash
вызывается для интерпретации сценария в результате другойbash
интерпретации оболочки:Это
bash
будет проходить_=/path/to/bash-scrip
в заданной средеbash-script
, и именно это будет первоначальное значение$_
bash
переменной вbash
оболочке, которая интерпретирует этот скрипт.Теперь, если приложение ссылающееся не пропускает
_
переменное окружение , вызванная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
).2. Впоследствии
Впоследствии не очень понятно , либо. На практике это происходит, как только
bash
интерпретируется простая команда в текущей среде оболочки.В случае интерактивной оболочки это будет, например, первая простая команда, интерпретируемая из
/etc/bash.bashrc
.Например, по приглашению интерактивной оболочки:
Для неинтерактивной оболочки это будет первая команда
$BASH_ENV
или код, переданный в эту оболочку, если$BASH_ENV
она не установлена.3. Когда Bash выполняет команду
Третий момент - это нечто иное, и намекается в обсуждении выше.
bash
Подобно нескольким другим оболочкам, передаваемым_
командам передается переменная окружения, содержащая путь, которыйbash
используется в качестве первого аргумента дляexecve()
системных вызовов.4. При проверке почты
Четвертый пункт описан более подробно в описании
MAILPATH
переменной:Пример:
источник
Попробуйте этот простой пример:
Запустите его, указав абсолютный путь (
/home/$USERNAME/test.sh
); вывод:Первый
$_
содержит путь, который вы использовали для вызова скрипта, а второй - первый аргумент в серединеecho
. Для третьего элемента в списке, если вы запустите новый терминал и наберете echo,$_
он покажет переменную,PATH
которая обычно используется для поиска и вызова команд (на моей машине с Ubuntu) в обычной оболочке или в абсолютном пути к вашему.bashrs
файлу в оболочка входаДля четвертого пункта со страницы руководства bash:
источник
echo $_
-EDITOR
и почему? В каком случае это следует? (3) Можете ли вы привести пример того, как проверять почту и как ее использовать$_
в этом случае?.bashrc
и закомментируйте каждую строку там. Оставьте только одну строку, содержащую команду, похожуюecho "test"
или похожую. Сохранить и закрыть. Тогда бегиbash
и немедленноecho $_
. Это последнее эхо должно напечатать тест на выходе.MAILPATH
в linuxcommand.org/lc3_man_pages/bash1.htmlДля случая 2 пример стоит тысячи слов:
Делает то, что вы догадались / на что надеетесь. Дает мне простой заполнитель, когда я в командной строке, чтобы избавить меня от необходимости повторяться.
источник