1

我希望我的 bash 提示字符串 1 同时具有日期/时间和最后一个命令的返回码。所以,我以为我可以做到

PS1="\[\e[00;34;01m\]\$(date +'%a %b %e, %T')\[\e[35m\] \$?\[\e[00m\] >> "

我认为这会给我一个蓝色日期(比如Thu Jul 2, 01:01:01)一个紫色的返回码,然后只是>>(假设 ansi 转义序列根据终端的大多数托盘产生“正常”颜色)。但是,它不起作用。


PS1="\$? >> "

PS1="\$(date +\"%a %b %e, %T\") >> "

但是,两者都有效,当我以第一种方式进行时,只有第一种"\$"被解释,而另一种只有在我的 bashrc 被获取时才会被解释。(因此,最初"\$?"评估为并保持。)00

关于为什么会发生这种情况的任何想法?

注意:我什至尝试过PS1='$(date +"%a %b %e, %T") $? >> '

其他人可以在 Unix bash 中复制这个吗?如果是/如果不是,请发表评论。

4

3 回答 3

3

它没有忽略$?(\$?只是一个转义版本,$?因此在设置变量时不会评估它,而是在扩展提示字符串时)。

相反,它会返回您运行的最后一个命令的退出代码;在这种情况下,始终是$(date ...)提示符前面的命令。由于该date命令永远不会失败,因此返回码始终为 0。

正如 Ian 指出的那样,要解决这个问题,您可以在提示字符串中使用\D{%a %b %e, %T}而不是\$(date ...)来格式化日期;因为它是内置的而不是单独的命令,所以它不会破坏$?.

于 2015-07-02T05:15:28.530 回答
1

我不知道为什么 bash 会忽略第二个 \$,但请尝试使用\D格式的日期:

PS1="\[\e[00;34;01m\]\D{%a %b %e, %T}\[\e[35m\] \$?\[\e[00m\] >> "

这在 bash 版本 4.2.46 下对我有用

于 2015-07-02T04:55:23.927 回答
1

您在提示符中看到的$?是 date 命令的退出代码。您可以这样验证它:

$ PS1="\[\e[00;34;01m\]\$(exit 10)\[\e[35m\] \$?\[\e[00m\] >> "
10 >>

解决方法:

$ PROMPT_COMMAND='EXIT_CODE=$?'
$ PS1="\[\e[00;34;01m\]\$(date +'%a %b %e, %T')\[\e[35m\] \$EXIT_CODE\[\e[00m\] >> "
于 2015-07-02T05:05:11.017 回答