PS1 不能有两个“\$”?

PS1 can't have two "\$"?

我希望我的 bash 提示字符串 1 同时具有最后一个命令的 date/time 和 return 代码。所以,我想我可以做

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

我认为这会给我一个蓝色日期(如 Thu Jul 2, 01:01:01)一个紫色 return 代码,然后只是 >>(假设 ansi 转义序列产生 "normal" 颜色基于大多数码头托盘)。但是,它不起作用。


PS1="$? >> "

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

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

关于为什么会发生这种情况有什么想法吗?

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

Can anyone else replicate this in Unix bash? If so/if not, please leave a comment.

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

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

这适用于 bash 版本 4.2.46

你在提示中看到的$?就是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\] >> "

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

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

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