終端機提示中顯示非列印字符

終端機提示中顯示非列印字符

如果沒有顏色,我的提示看起來像這樣:

[0] [dimo414@dimo414:/tmp]
$ echo $PS1 | sed 's/\x1b/\\e/g'
\n[0] [dimo414@dimo414:/tmp]\n\$

我會加一些顏色並\[......\]界定它:

[0] [dimo414@dimo414:/tmp]
$ echo $PS1 | sed 's/\x1b/\\e/g'
\n[\[\e[32m\]0\[\e[0m\]] [\[\e[34m\]dimo414\[\e[0m\]\[\e[32m\]@dimo414\[\e[0m\]:\[\e[94m\]/tmp\[\e[0m\]]\n\$

原始提示

看起來很棒!但是Bash常見問題解答指出:

\[ \] 僅當您指派 PS1 時才特殊,如果您將它們列印在顯示提示時運行的函數中,則它將不起作用。在這種情況下,您需要使用位元組 \001 和 \002

然而,當我更改提示來使用時\001\002我得到了這個(StackExchange 似乎正確地將它們呈現為零寬度字符,但它們就在那裡):

[0] [dimo414@dimo414:/tmp]
$ echo $PS1 | sed 's/\x1b/\\e/g'
\n[\e[32m0\e[0m] [\e[34mdimo414\e[0m\e[32m@dimo414\e[0m:\e[94m/tmp\e[0m]\n\$

新的、損壞的提示

同樣的提示 - 帶有\001... \002- 在 OSX 上的 iTerm2 中看起來是正確的。

我使用這兩個命令來轉義顏色序列:

# Previously (works)
printf '\[%s\]' "$(color "$@")"

# Currently (doesn't work on Ubuntu)
printf '\001%s\002' "$(color "$@")"

為了在 Ubuntu 上使用\001... ,我應該做什麼而不是第二個選項?\002

相關內容