PS1不能有两个" \ $"?

时间:2015-07-02 04:36:03

标签: bash ps1

我希望我的bash Prompt String 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来源时被解释。 (因此,"\$?"最初评估为0并保持0。)

有关为何发生这种情况的任何想法?

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

  

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

3 个答案:

答案 0 :(得分:3)

它不会忽略$?\$?只是$?的转义版本,因此在设置变量时不会对其进行评估,而是在提示字符串已扩展。)

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

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

答案 1 :(得分:1)

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

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

这适用于bash版本4.2.46

答案 2 :(得分: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\] >> "