[英]How can I pipe a prompt string (PS1) into a command and have the text result be PS1?
[英]PS1 can't have two “\$”?
我希望我的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來源時被解釋。 (因此, "\\$?"
最初被評估為0
並保持為0
)
為什么會這樣呢?
注意:我什至嘗試過PS1='$(date +"%a %b %e, %T") $? >> '
PS1='$(date +"%a %b %e, %T") $? >> '
其他人可以在Unix bash中復制嗎? 如果是/否,請發表評論。
它不忽略$?
( \\$?
只是逸出版本$?
所以,當你設置的變量,而是當提示字符串被擴展不計算)。
相反,它返回您運行的最后一個命令的退出代碼。 在這種情況下,始終是提示符前面的$(date ...)
命令。 由於該date
命令永遠不會失敗,因此返回碼始終為0。
要解決此問題,正如Ian所指出的,您可以在提示字符串中使用\\D{%a %b %e, %T}
代替\\$(date ...)
來格式化日期。 由於它是內置的而不是單獨的命令,因此不會破壞$?
。
我不知道為什么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\] >> "
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.