我希望我的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中复制这个吗?如果是这样/如果没有,请发表评论。
答案 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\] >> "