$?
Переменная имеет статус выхода последней команды запуска. Существует ли переменная, которая содержит последнюю команду запуска?
bash
shell
scripting
environment-variables
Eimantas
источник
источник
Ответы:
Используйте
fc
для получения предыдущей командной строки. Обычно он используется для редактирования предыдущей командной строки в вашем любимом редакторе, но также имеет режим «списка»:last_command="$(fc -nl -1)"
источник
caller
и Баш массивыBASH_LINENO
,BASH_SOURCE
иFUNCNAME
делать вид трассировки стека.Если последняя команда была выполнена без аргументов, она будет сохранена в
$_
переменной. Обычно он содержит последний аргумент предыдущей команды - поэтому, если аргументов не было, значением$_
является сама последняя команда.Другой вариант - узнать подробности последней фоновой команды. Как писал l0b0,
$!
содержит его PID - так что вы можете анализировать выводps $!
(возможно, с дополнительными опциями форматированияps
).источник
Нет, но вы можете получить его во время выполнения, чтобы сохранить для других команд:
$0
Путь текущего сценария оболочки.$FUNCNAME
: "Имя текущей функции.""$@"
: Все параметры текущей команды, указаны отдельно.$!
: "PID (идентификатор процесса) последнего запуска задания в фоновом режиме."$$
: "Идентификатор процесса (PID) самого скрипта."Поэтому полная команда текущего скрипта должна быть
"$0" "$@"
. Если это функция, то так и должно быть"$FUNCNAME" "$@"
. Возможно, вы захотите сохранить это в массиве для дальнейшей обработки. Например, сохраните это вtest.sh
:При запуске
./test.sh "first argument" "second argument"
он должен вернуть:Какие эквивалентные звонки.
источник
BASH_COMMAND
переменная, но она, кажется, не пригодится ни в коем случае, кроме использования в ловушках.some-command
сценарий оболочки, и он терпит неудачу. У меня будет ненулевой статус$?
, будет ли "нет" все еще сохраняться для существования переменной храненияsome-command
?DEBUG
Ловушка позволяет выполнить команду прямо перед любым простым выполнением команды. Строковая версия команды для выполнения (со словами, разделенными пробелами) доступна вBASH_COMMAND
переменной.Обратите внимание, что это
previous_command
будет меняться при каждом запуске команды, поэтому сохраните ее в переменной, чтобы использовать ее. Если вы также хотите узнать статус возврата предыдущей команды, сохраните обе в одной команде.Если вы хотите отменить только неудачные команды, используйте,
set -e
чтобы ваш скрипт завершился с первой неудачной командой. Вы можете отобразить последнюю команду изEXIT
ловушки .Альтернативный подход, который может работать для некоторых целей, заключается в том,
set -x
чтобы распечатать трассировку выполнения скрипта и изучить последние несколько строк трассировки.источник
Я считаю необходимым найти последнюю неудачную команду при наличии
set -e
иset -o pipefail
опций, так как в противном случае bash просто прерывается без обратной связи о причине, поэтому я нашел, что это работает хорошо:Если вы запустите вышеприведенное, вы увидите вывод ниже:
Номер строки не всегда может быть точным, но он должен дать вам что-то достаточно близкое, чтобы быть полезным.
источник