Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在随后的bash提示符中包括非0退出代码_Bash_Command Prompt - Fatal编程技术网

在随后的bash提示符中包括非0退出代码

在随后的bash提示符中包括非0退出代码,bash,command-prompt,Bash,Command Prompt,偶尔,我会运行一个有很多输出的命令。偶尔,该输出的最后30-40行(也就是我真正看到的输出的唯一部分)是正常的,但更进一步,出现了一个错误。我想让大家更容易注意到命令失败了。为此,我希望返回代码成为提示符的一部分。所以我拿了我的$PS1: [\D{%Y-%m-%d} \t] \[\e]0;\u@\h: \w\a\]\$ …并将其扩展到: [\D{%Y-%m-%d} \t] ${?/^0$/} \[\e]0;\u@\h: \w\a\]\$ 这将导致如下提示: [2011-05-10 09:38

偶尔,我会运行一个有很多输出的命令。偶尔,该输出的最后30-40行(也就是我真正看到的输出的唯一部分)是正常的,但更进一步,出现了一个错误。我想让大家更容易注意到命令失败了。为此,我希望返回代码成为提示符的一部分。所以我拿了我的$PS1:

[\D{%Y-%m-%d} \t] \[\e]0;\u@\h: \w\a\]\$
…并将其扩展到:

[\D{%Y-%m-%d} \t] ${?/^0$/} \[\e]0;\u@\h: \w\a\]\$
这将导致如下提示:

[2011-05-10 09:38:07] 0 soren@lenny:~$ 
但是,我想找到一种方法,使其仅在非0时包含退出代码。我该怎么做?当然,我可以用

$(echo \$? | sed -e blah)

但是,尽管sed很轻,但它的重量仍然比bash的内置组件重很多。

有点
printf
滥用:

printf '%.*s' $? $?
这是我在工作中使用的方法,可以得到一个带有退出代码的红色数字。冗长,但它完成了任务,应该是可移植的

highlight()
{
    if [ -x /usr/bin/tput ]
    then
        tput bold
        tput setaf $1
    fi
    shift
    printf -- "$@"
    if [ -x /usr/bin/tput ]
    then
        tput sgr0
    fi
}

highlight_error()
{
    highlight 1 "$@"
}

highlight_exit_code()
{
    exit_code=$?
    if [ $exit_code -ne 0 ]
    then
        highlight_error "$exit_code "
    fi
}

PS1='$(highlight_exit_code)...'

您可以使用bash的内置模式匹配:

$ rc=0
$ echo ${rc##0}

$ rc=123
$ echo ${rc##0}
123

您可以在PS1中放置一条if语句,该语句仅在退出状态为非零时才回显:

PS1='[\D{%Y-%m-%d} \t] $(es=$?; if [ $es -ne 0 ]; then echo $es; fi) \[\e]0;\u@\h: \w\a\]\$'

以下是我的作品:

PS1=“[\D{%Y-%m-%D}\t]\u@\h:\w\a\${?##0}\$”

例如,当$?是0:
一种常见的方法是使用
trap。。。在命令失败时执行任意代码时出错:

 $ trap 'echo $?' ERR
 $ true
 $ false
1
 $

一个典型的UNIX恶作剧是'echo You have new mail'。ERR

对于zsh用户:将此插入您的提示符:
%(?,-%?-)
这是我使用的提示符,插入.bashrc并将其源代码化以使用它。正如您所看到的,只有在值不是0的情况下,才会将PREV_RET_VAL附加到PS1

COLOR_RED_BOLD="\[\e[31;1m\]"
COLOR_GREEN_BOLD="\[\e[32;1m\]"
COLOR_NONE="\[\e[0m\]"

# prompt function
promptFunc()
{
PREV_RET_VAL=$?;

PS1=""

PS1="${PS1}\e[1;30m[\e[1;34m\u@\H\e[1;30m:\e[0;37m \e[0;32m\d \T\e[1;30m]\e[1;37m \w\e[0;37m\[\033]0; \w - \u@\H \007\]\n\[\] "

if test $PREV_RET_VAL -eq 0
then
    PS1="${PS1}${COLOR_GREEN_BOLD}\\$ ${COLOR_NONE}"
else
    PS1="${PS1}${COLOR_RED_BOLD}\\$ [${PREV_RET_VAL}] ${COLOR_NONE}"
fi
}

PROMPT_COMMAND=promptFunc
单引号示例:

PS1='${?#0}>'

双引号示例(注意额外的反斜杠以转义
$

PS1=“\${?\0}>”

样本输出:

> echo 'ok'
ok
> bogus
bogus: command not found
127> 
说明:
${var#pattern}
是一个bash参数扩展,它意味着从$var前面删除最短的匹配模式。因此,在本例中,我们从
$?
前面删除
0
,这将有效地截断
0
的退出代码


如果使用双引号,
$?
将在设置了
PS1
时被替换,而不是每次进行计算。执行
echo$PS1
以确认在
PS1
中没有硬编码值这也是我的第一个想法,但我拒绝了它,认为它只会去除任何0,但当然不是这样。这似乎奏效了。唯一的缺点是在0退出代码的情况下会有多余的空间。如果你想了解更多关于这方面的信息,请查看子字符串删除部分中的“这两种方法都有效”并让我发笑。我喜欢。我稍微扩展了它:
printf'%s%'%s'$?$?'
这使得它仅在非零时添加一个空格。为了便于使用,在primpt中使用$(foo)只计算foo一次(而不是在每个命令中)。请参阅以了解如何解决此问题。说明:这是我使用的方法,因为它允许使用
else
子句。请注意将
$?
复制到局部变量的重要性,因为
[
将在到达
回显
之前覆盖它。交叉重复:
COLOR_RED_BOLD="\[\e[31;1m\]"
COLOR_GREEN_BOLD="\[\e[32;1m\]"
COLOR_NONE="\[\e[0m\]"

# prompt function
promptFunc()
{
PREV_RET_VAL=$?;

PS1=""

PS1="${PS1}\e[1;30m[\e[1;34m\u@\H\e[1;30m:\e[0;37m \e[0;32m\d \T\e[1;30m]\e[1;37m \w\e[0;37m\[\033]0; \w - \u@\H \007\]\n\[\] "

if test $PREV_RET_VAL -eq 0
then
    PS1="${PS1}${COLOR_GREEN_BOLD}\\$ ${COLOR_NONE}"
else
    PS1="${PS1}${COLOR_RED_BOLD}\\$ [${PREV_RET_VAL}] ${COLOR_NONE}"
fi
}

PROMPT_COMMAND=promptFunc
> echo 'ok'
ok
> bogus
bogus: command not found
127>