Bash

BASH - 自定義 PS1 以執行命令

  • October 21, 2021

我想修改我的 PS1 以每次執行一些命令。假設我想要它,如果最後執行的命令成功,它會在 PS1 的末尾添加一個綠色的微笑,否則微笑應該是紅​​色的。

我將它提取到一個函式中:

function exit_smile {

   EXITSTATUS="$?"
   RED="\[\e[1;31m\]"
   GREEN="\[\e[32;1m\]"

   if [ "${EXITSTATUS}" -eq 0 ]
   then
      SMILE="${GREEN}:)"
   else
      SMILE="${RED}:("
   fi

   echo -n "$SMILE"
}

然後嘗試使用exit_smile\$(exit_smile)修改 PS1 變數,但它在修改 PS1 或列印文字\[\e...\]而不是顏色時執行一次。

例如

PROMPT="\u@\h \W"
PS1="${PROMPT} \$ \$(exit_smile) ${OFF}\n"

給出username@hostname ~ $ \[\e[32;1m\]:)

我錯過了什麼?

我不確定這是否在版本(*)之間發生了變化,但是我的 Bash 手冊頁說

Bash 允許通過插入一些反斜杠轉義的特殊字元來自定義這些提示字元串,這些特殊字元解碼如下:

(列表包含\e,\[\]

字元串解碼後,通過參數擴展,命令替換,……

這意味著\[..\]不能來自命令替換,但必須在此之前存在。

(這也意味著您可以使用\uor\w作為命令替換的參數,並且它們會在命令執行之前被替換。而且我不知道放入\[..\]命令替換會做什麼……這會更有意義大約。)

因此,我們必須將顏色程式碼放在單獨的擴展中並\[..\]用手保護它們。我將使用變數而不是命令替換,以及$'...'獲取 ESC 字元的擴展:

prompt_smile() {
       if [ "$?" = 0 ] ; then
               smile=' :) '
               smilecolor=$'\e[1;32m'
       else
               smile=' :( '
               smilecolor=$'\e[1;31m'
       fi
       normalcolor=$'\e[0m'
}

PROMPT_COMMAND=prompt_smile
PS1='\u@\h \W \$ \[$smilecolor\]$smile\[$normalcolor\]\n'

(*我對此感到疑惑的原因是,對較舊且相似但沒有如此重複的問題的答案似乎\[..\]從擴展中輸出)

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