OpenBSDで緑/赤の端末を取得するには?

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)

(私は成功しませんでした。ラップトップから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' '

おすすめ記事