PS1 で設定された色付きテキストとコマンドからの色付き出力が互いに混乱する

PS1 で設定された色付きテキストとコマンドからの色付き出力が互いに混乱する

PS1、開始カラー シーケンス ( など\[\e[0;32m\]) で終了し、ターミナル内のすべてのテキストに色 (この場合は緑) を付けます。ただし、 (では にlsエイリアスされている) などのコマンドを使用すると、出力の色が少しおかしくなります。最初の「色付き」単語までは緑ですが、その後の色の付いていないテキストは緑ではなく白になります。ls --color=auto.bashrc

どのような場合でもきれいな出力を得る方法はありますか? 出力に色がある場合、テキストの「デフォルト」の色として白を使用しても問題ありませんが、一貫性を保ちたいです。

もちろん、すべてのコマンドに自動的に適用され、コマンドの呼び出し方法を変更する必要がないソリューションが最も望ましいです。

個人的には、何もアイデアがありません。出力内のエスケープ シーケンスを「オンザフライ」で検索し、いくつかの置換を実行するために何かできるでしょうか? ただし、これを実装する方法、特に「舞台裏で」実行する方法についてはわかりません。

答え1

理由はあなたが間違ったやり方をしているからです。

プロンプトの最後に「オープン」カラーシーケンスがあると言いましたが、これは間違いです。カラーネストしない。「開く」や「閉じる」はありません。「... に切り替える」または「デフォルトにリセットする」(実際には「0 に切り替える」) です。したがって、ls --color=auto何かの色が切り替わると、完了時にデフォルトにリセットするシーケンスが発行されます。「以前の状態に戻る」ではありません。

ターミナルが「デフォルト」にしたいテキストの色 (つまり、パレット番号 0) を使用するように設定します。次に、プロンプトに別の色を使用したい場合は、最初に設定し、最後にリセットします。

詳細については、Bash Prompt HOWTOをご覧ください。第6章 ANSIエスケープシーケンス: 色とカーソルの移動ドキュメンテーション。

答え2

前に回答したように、PS1開始カラー シーケンスで終了するのは良い考えではありません。これにより、色付きコマンドの出力が間違って表示されます。ターミナルの前景色 (通常のテキスト色) を緑色にしたい場合は、両方のマシンのターミナル エミュレーター設定 (この場合はguakeターミナル設定) で緑に設定するだけです。この方法では、前景色は緑色のままになり、色付き出力のコマンドはこの色を使用して通常のテキストを表示します。PS1で行うようにプロンプ​​トをリセットします\[\e[0m\]

答え3

異なるマシンごとに異なる色のプロンプトを表示する方法は次のとおりです。

case $HOSTNAME in
    host1*) PSC="\e[32m" ;;
    host2*) PSC="\e[33m" ;;
    host3*) PSC="\e[34m" ;;
    host4*) PSC="\e[35m" ;;
    *) PSC="\e[36m" ;;
esac

PS1="[\j]\[${PSC}\]\u@\h(\l) \[\e[37m\][ \w ]\[\e[00m\]\n\[\e[1m\]\#\[\e[0m\] \$ "

残りは好みに合わせてください。この ~/.bashrc のコピーを、使用するすべてのマシンに配置します。NFS マウントされたホームを使用する場合は、自動的に行われます。

関連情報