
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)
(私は成功しませんでした。ラップトップからOpenBSDシステムとしてSSHを使用してubuntu / gnome-terminalを使用しました。)
答え1
各シェルにはプロンプトを拡張する独自の方法があります。 OpenBSDのkshはpdkshです。プロンプト設定の表示手動、PS1
パラメータの下。
kshは、プロンプトを印刷する前に、値に対してパラメータ$
置換、コマンド置換、および算術置換(すべての拡張)を実行することによって機能します。PS1
したがって、一度だけ設定すると、PS1
値は毎回再生成されます。 (shopt -s promptvars
自分で入力すると、bashでもこれを行うことができます.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では迷惑です。 - 幅0の制御シーケンスのため、再描画エラーが発生します。これは、マニュアルに記録されている深刻なハッキングで回避できます。
以下は、算術を使用してサブシェルの生成を防ぎ、印刷できないシーケンスを分離するより複雑なコードです。
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' '
答え2
問題は次の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が正しくインストールされている場合、通常はハードコーディングされたエスケープシーケンスよりも移植性とメンテナンスが簡単です。