PS1を正しくカスタマイズする方法は?

PS1を正しくカスタマイズする方法は?

bashrcでこれでbashをカスタマイズしました。

export PS1="\e[0;36m\h\e[m \e[0;33m\w/\e[m \e[0;31m\n\$ →\e[m  "

だから私は次のようなものを得ます(色を含む)。

Ahuri ~/Public/ 
$ →  

しかし、長いコマンドには問題があります。 1行より長い非常に長いコマンドを書くと、最初の行が上書きされ始めます。

例:

Ahuri ~/Public/ 
$ → ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

「^」を引き続き追加すると、次のような結果が得られます。

Ahuri ~/Public/ 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

私の「$→」を上書きし、行全体を上書きします。

答え1

大丈夫です\n。これは再び古いエスケープシーケンス長の問題です。\e[0m同様の内容はプロンプトの実際の長さには含まれていないため、インタプリタに指摘するには\[..で囲む必要があります。\]

PS1="\[\e[0;36m\]\h\[\e[m\] \[\e[0;33m\]\w/\[\e[m\]\n \[\e[0;31m\]\$ →\[\e[m\]  "

答え2

より簡単なオプションは、tputシーケンスを使用することです。

export PS1='\[$(tput setaf 4)\]\h\[$(tput sgr0)\] \[$(tput setaf 3)\]\w/\[$(tput sgr0)\]\n\[$(tput setaf 1)\]\$ →\[$(tput sgr0)\] '

シェルが印刷可能な出力として計算されないように、コマンド置換()で挿入された端末制御シーケンスを\[束ねます。ハードワイヤー方式の代わりにコマンド置換を使用すると、より多くの利点が得られます。\]$(tput … )正しい端末タイプが何であれ、順序を制御します。

答え3

追加の行を表示して入力する必要が$PROMPT_COMMANDないようにするために使用されます。\n$PS1

関連情報