检查上一个命令是否为"有效"

时间:2014-08-05 23:11:13

标签: bash .bash-profile

我在.bashrc中定义了一个函数,显示上一个命令是否成功完成(从the full version简化):

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(或最后一个“真实”命令的输出),即使我所做的只是按下返回按钮而没有实际执行命令(example output )。

如果命令实际运行,我怎么能让脚本只显示消息?

2 个答案:

答案 0 :(得分:2)

正如其他人所提到的,它不需要在提示中显示这么长的消息。以下是我使用的Bash提示:

The screenshot

正如您所看到的,当提示中的退出值为非零时,它将变为RED,因此您可以轻松地知道该命令刚刚失败。如果命令被信号杀死,则还会显示信号编号和名称。在上面的屏幕截图中,130:2:INT表示退出的最后一个命令130(= 128 + 2),它被信号2SIGINT)杀死。

以下是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] # '

答案 1 :(得分:1)

在命令行中执行此操作的最简单方法之一是使用逻辑运算符。

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

当然,您可能希望在脚本中使用更实质的内容,但这通常是我执行此操作的方式。