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 ...)
来格式化日期;因为它是内置的而不是单独的命令,所以它不会破坏 $?
.
我希望我的 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 ...)
来格式化日期;因为它是内置的而不是单独的命令,所以它不会破坏 $?
.