Bash

非列印轉義序列:何時?

  • December 31, 2017

最近,我在終端中玩了很多顏色,因此也玩轉義序列。我已經閱讀了 Bash 手冊頁的相關部分以及網路上許多有用的頁面。

我已經得到了我想要的大部分工作;例如,漂亮的彩色 Bash 提示。也就是說,我仍然對何時應該使用(或需要使用)“非列印轉義序列”字元感到有些困惑。那些將是\[\]

如果我在定義我的提示時沒有在 PS1 中使用它們,那麼我的提示肯定不會正確顯示。如果我確實使用它們,一切都很好。好的。

但是,在 PS1 之外,它們的操作方式似乎不同。例如,為了使腳本更具可讀性,我定義了一個$RGB_PURPLE通過簡單函式設置的變數c8_rgb()。最終結果是該變數包含\[\e[01;38;05;129m\]打開粗紫色前景色的值。

當我在 PS1 中使用這個變數時,它會達到我的預期。如果我通過它使用它,printf或者echo -e它“一半”有效。該命令printf "${RGB_PURPLE}TEST${COLOR_CLR}\n"(其中COLOR_CLR是重置文本屬性的轉義序列)會導致以下顯示:\[\]TEST\[\]除了第一個\[和最後一個以外的所有內容\]都顯示為紫色。

為什麼有區別?為什麼這些括號被列印而不是由終端處理?我本來希望它們在作為提示的一部分列印時與通過其他方式列印時的處理方式相同。我不明白這種變化。

從經驗上看,這些字元似乎必須在提示定義中使用,而在幾乎所有其他情況下*都不應該使用它們。*這使得很難使用像我c8_rgb()上面提到的函式這樣的通用函式來處理轉義序列的生成和輸出,因為該函式無法知道它的結果是在提示配置中還是在其他地方。

還有一個相關的問題:在輸出轉義序列echo -e方面printf是否相同?我通常使用 printf,但有任何理由偏愛其中一個嗎?

誰能解釋這種明顯的細微差別?在終端中使用轉義序列(通常僅用於顏色)時,我應該注意哪些其他奇怪的事情?謝謝!

在使用非列印字元時需要“非列印轉義序列” $ PS1 because bash needs to know the position of the cursor so that the screen can be updated correctly when you edit the command line. Bash does that by counting the number of characters in the $ PS1 提示,然後是游標所在的列號。

但是,如果您在 $PS1 中放置非列印序列,則該計數是錯誤的,並且如果您編輯命令行,則該行可能會混亂。因此引入了\[\]標記來指示不應計算封閉的字節。

引用自:https://unix.stackexchange.com/questions/157878