bash - 複雑なプロンプト

bash - 複雑なプロンプト

私は非常に複雑なプロンプトが欲しい。これには、ログイン名、コンピュータ名、日付、時刻、作業ディレクトリ、最後のコマンドの結果、および改行文字を含める必要があります。私もアイテム一つ一つに色を塗りたかったです。だから私は.bashrc次のようなモンスターを挿入しました。

# login and computer name
PS1='[\e[1;37m\]\u\e[m\]@\e[1;32m\]\h\e[m\]] '
# date, time and working directory
PS1=$PS1'[\e[1;34m\]\D{%Y-%m-%d} \e[1;35m\]\t\e[m\]] \e[1;33m\]\w\e[m\] '
# result of last command and command prompt in new line
PS1=$PS1'\e[1;31m\]${?#0}\e[m\]\n \e[1;36m\]\$\e[m\] '

私はこれが悪い解決策であることを知っていますが、それを改善するにはbashの経験が少なすぎます。しかし、それが唯一の問題ではありません。

 $ aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bash: bbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: command not found...

ただし、ビジュアルカラットは最後のキーをa押しHomeてからコマンドの先頭に移動しません。ご覧のとおり、実際のカラットは最初にあります。なぜこれが起こるのですか?コマンドプロンプトをどのように改善できますか.bashrc


修正する:

@Groxxdaの提案を使用した後、別の問題が発生しました。私の.bashrc PS1定義は次のとおりですこれ。今は説明した問題は発生しません。しかし、私のコマンド履歴にあり、lsこれまではあり、cat script.sh矢印を2回上にスライドさせると、コマンドと同じ結果が得られ、cat sclsバッファには2つのシンボルしかありません(のみls)。なぜこれが起こるのですか?この問題にどのように対処する必要がありますか?

答え1

\[プロンプトテキストの見えない部分をおよびで囲む必要があります\]。プロンプト全体の長さを計算する
ために使用されるため、印刷後のカーソル位置を決定できます。たとえば、ANSIカラーエスケープコードは表示されません。後で出力されるテキストの色を変更します。次のように閉じる必要があります。bash

\e[1;35m~になる\[\e[1;35m\]

アップデートではこれが役に立つと書いていますが、別の問題があります。 /で履歴を有効にすると、
画面は正しい位置から消去されません。UpDown

これは最初の問題の別の側面にすぎません。プロンプトのテキスト長の計算が正しくありません。

リンクで修正されたプロンプトテキストを見てみましょう。

# login and computer name                                                      
PS1='[\e[\[1;37m\]\]\u\e[\[m\]\]@\e[\[1;32m\]\]\h\e[\[m\]\]] '                  
# date, time                                                                    
PS1=$PS1'[\e[\[1;34m\]\]\D{%Y-%m-%d} \e[\[1;35m\]\]\t\e[\[m\]\]] '              
# working directory and result of last command                                  
PS1=$PS1'\e[\[1;33m\]\]\w\e[\[m\]\] \e[\[1;31m\]\]${?#0}\e[\[m\]\]\n '          
# command prompt                                                                
PS1=$PS1'\e[\[1;36m\]\]\$\e[\[m\]\] '

問題は、フルカラーエスケープシーケンスが含まれていないことです。\[プロンプトは次のように終了します。\]

[\e[\[1;37m\]\]... 

ここで色のエスケープシーケンスはです\e[1;37m。したがって、エスケープ文字\e[その両方が外部にあります。少なくとも[見えると思われます。また、\]問題は発生しませんが、少なくとも混乱を引き起こす2つのクロージャがあり、入れ子にすることはできません。
正しい作成方法は次のとおりです。

[\[\e[1;37m\]... 

他の色エスケープシーケンスにも同じ問題があります。

答え2

モジュール化する必要があります。これによりトレースが簡単になります。

CS='\[\033[1;3' CE='m\]'
WT=${CS}7${CE} LB=${CS}6${CE} PR=${CS}5${CE} \
DB=${CS}4${CE} YL=${CS}3${CE} GN=${CS}2${CE} RD=${CS}1${CE} 
CE='\[\033[m\]' CS=

今あなたはあなたの仕事をします:

# login and computer name                                                      
PS1="[${WT}\u${CE}@${GN}\h${CE}] "

...

ちょっと…私は見ましたか?これにより、何が起こっているのかをより簡単に知ることができます。

関連情報