Проверьте, была ли предыдущая команда "действительной"

У меня есть функция, определенная в .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

Естественно, вы можете захотеть что-то более существенное в сценарии, но обычно я так поступаю.

Другие вопросы по тегам