Prompt

如何在 OpenBSD 下獲得綠色/紅色終端?

  • May 7, 2012

對於 linux 機器,我可以使用:

# vi ~/.bashrc # red/green terminal colors regarding exit code

export PROMPT_COMMAND='PS1="`
if [[ \$? = "0" ]];
then echo "\\[\\033[0;32m\\]";
else echo "\\[\\033[0;31m\\]";
fi`[\u@\h \w]\[\e[m\] "'
export PS1

退出碼為0時為綠色終端,退出碼為非0時為紅色提示。

如何在 OpenBSD 下做到這一點?(預設 ksh)

(我試圖這樣做,但沒有運氣 - 使用 ssh 從我的筆記本連接到 OpenBSD 機器 - ubuntu/gnome-terminal。)

問題是bash只有PROMPT_COMMAND. 試試這個:

PS1='\[$(if (($?)); then tput setaf 1; else tput setaf 2; fi)\]'\
'[\u@\h \w]\['"$(tput sgr0)"'\]'

¹ 警告:我ksh沒有PROMPT_COMMANDbash.

²tput使用您系統的terminfo數據庫。如果 terminfo 安裝正確,這通常比硬編碼轉義序列更便攜和可維護。

每個 shell 都有自己的擴展提示的方式。OpenBSD 的 ksh 是 pdksh。參見手冊PS1中參數下的提示設置。

ksh 的工作方式是在列印提示之前$對 的值執行參數替換、命令替換和算術替換(所有擴展)。PS1因此,您PS1一勞永逸地設置,但每次都會重新生成該值。(你也可以在 bash 中做到這一點,如果你把shopt -s promptvars你的.bashrc.)

OpenBSD 的 ksh 支持類似於 bash 的反斜杠轉義。對於其他版本的 ksh,您還需要將 bash 提示轉義序列轉換為$替換。

PS1='$(if (($? == 0)); then print -n "\\033[32m"; else print -n "\\033[31m"; fi)'
PS1="$PS1"'[\u@\h \w]'$(print '\033')'[0m '

上面的簡單翻譯有幾個缺陷:

  • 它每次分叉一個程序,用於分析$?。有一種方法可以避免這種情況,但在 ksh88 中它是 hackish。
  • 由於零寬度控制序列,它會導致重繪錯誤。這可以通過手冊中記錄的粗略破解來避免。

這是一些更複雜的程式碼,它使用算術來避免產生子外殼並負責分隔不可列印的序列。

escape=$(print '\033')
ctrla=$(print '\001')
PS1=$(print '\001\015')
PS1=$PS1$ctrla$escape'[$(($? ? 31 : 32))m'$ctrla
PS1=$PS1'[\u@\h \w]'
PS1=$PS1$ctrla$escape'[0m'$ctrla' '

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