Проверьте, была ли предыдущая команда "действительной"
У меня есть функция, определенная в .bashrc
это показывает, была ли предыдущая команда выполнена успешно или нет (упрощено из полной версии):
function previous_command_status()
{
if [ $? -eq 0 ]; then
echo "Command successful"
else
echo "Command failed with exit code $exit_code"
fi
}
PROMPT_COMMAND="previous_command_status"
Проблема в, Command successful
отображается сразу же после запуска приглашения, даже если я еще не "официально" запускал какие-либо команды. Во-вторых (и по той же причине), скрипт отображает Command successful
(или вывод последней "реальной" команды), даже если все, что я сделал, это нажал кнопку возврата без фактического выполнения команды ( пример вывода).
Как я могу заставить скрипт отображать сообщение, только если команда действительно была запущена?
2 ответа
Как уже упоминалось другими, нет необходимости отображать так долго сообщение в приглашении. Ниже приводится Bash
подскажите я использую:
Как вы можете видеть, значение выхода в приглашении становится КРАСНЫМ, когда оно не равно нулю, поэтому вы можете легко узнать, что команда просто не прошла. И если команда будет прервана сигналом, номер и имя сигнала также будут отображены. На приведенном выше скриншоте 130:2:INT
означает, что последняя команда вышла с 130
(= 128 + 2) и был убит по сигналу 2
(SIGINT
).
Ниже приведен код в bashrc
:
function _PS1_command()
{
local lastexit=$?
local ESC=$'\033'
(( lastexit )) && g_PS1_Qcolor="$ESC[1;31m" || g_PS1_Qcolor=
g_PS1_signal=
if (( lastexit > 128 )) && kill -l $(( lastexit - 128 )) > /dev/null
then
(( g_PS1_signal = lastexit - 128 ))
g_PS1_signal="$g_PS1_signal:$( kill -l $g_PS1_signal )"
fi
return $lastexit
}
PROMPT_COMMAND=_PS1_command
PS1='[\w $g_PS1_Qcolor$?${g_PS1_signal:+:}$g_PS1_signal\e[0m] # '
Один из самых простых способов сделать это в командной строке - с помощью логических операторов.
cmd && echo success # this will not print if cmd fails
cmd || echo command failed # this will only print if cmd fails
cmd1 && echo success || echo fail # this will print fail or success depending on outcome
Естественно, вы можете захотеть что-то более существенное в сценарии, но обычно я так поступаю.