Bash 提示 - 多字節 unicode 字元的八進製表示適用於提示,但在手動執行時不起作用(相同的腳本)?
給定 shell 腳本 myPrompt.sh:
#!/bin/bash printf "Llama \001\360\002\001\237\002\001\255\002\254 Llama $> "
…以及配置為執行上述腳本的 bash 提示符:
alias myPrompt="/home/you/myPrompt.sh" PS1="\$(myPrompt)"
在上述場景中,函式執行並產生輸出
$$ 🭬 $$正確顯示。 但是,如果我通過以下方式手動呼叫相同的確切腳本:
./myPrompt.sh
輸出不同並且顯示的 unicode 字元相對於正在列印的八進製表示已損壞。這張照片很好地突出了這個問題。Bash Prompt 顯然會產生正確的結果,而手動呼叫會使其混亂,即使它們正在執行完全相同的腳本。為什麼我的腳本在作為我的 bash 提示符自動執行時可以正確執行和顯示,但如果我手動執行 bash 腳本則不能?
上述問題的故事與研究
最初,我使用自定義 bash 腳本來啟動我的 bash 提示符,並在嘗試從擴展符號字元空間中合併一個晦澀的 unicode 字元時遇到了極大的麻煩。特別是這個大的春古三角字元
$$ 🭬 $$. 作為我的 bash 提示符執行時,它顯示得很好。但是,任何後續的換行都會中斷,在輸入長命令時會造成各種麻煩。 最終,我確定這是因為大 chungus 三角形 unicode 字元通過報告它是 4 個字元而脫離了終端,即使它在視覺上只佔用 1 個字元空間。
簡單解釋,這些較大的 unicode 字元實際上是按特定順序組合在一起的較小 unicode 字元,終端可以正確地在視覺上顯示它們,但在內部會感到困惑,並將它認為游標所在的列增加一個以上視覺顯示的字元。
所以 10 小時後,我終於發現我可以將我的 unicode 字元分解為四個八進制,然後將 4 個八進制中的前三個包裹在
\001
&中\002
。通過像這樣包裝它們,我實際上是在告訴終端,嘿將此字元提供給輸出/顯示,但不要增加列位置。這產生了奇蹟,奇怪的 unicode 字元顯示在我的提示符中,如果我的命令中發生換行,終端不會搞砸。就在我以為我已經完成的時候,有什麼東西抓住了我。該腳本在我的 bash 提示符下執行良好,但是當手動呼叫時,該腳本會輸出損壞的 unicode 垃圾。什麼給出了,除了執行我的 shell 腳本之外,PS1 是否對我的 shell 腳本的輸出做一些事情?
在處理提示時,shell 會使用一些序列
\[
,\]
例如注意提示的零寬度部分,但這些字元在直接列印時不會以這種方式解釋。我很驚訝\001
and\002
以您注意到的方式工作 - 但這可能與您使用的任何字元編碼有更多關係?在任何情況下,要在不設置提示的情況下列印一些內容並查看它在提示上的樣子,在 bash 中,您可以
P
在變數擴展中使用 (for prompt) 運算符:SOME_PROMPT_STRING="\u@\h:\W\$" echo "${SOME_PROMPT_STRING@P}"