Prompt
如何在 OpenBSD 下獲得綠色/紅色終端?
對於 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_COMMAND
在bash
.²
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' '