web-dev-qa-db-ja.com

シェルプロンプト行折り返しの問題

OS X(10.5.7)ターミナルでBashシェルプロンプトを壊すために何かをしました。

これは私が設定したPS1です:

PS1='\[\e[1;32m\]\h\[\e[0m\]:\[\e[1;34m\]\w\[\e[0m\]\$ '

私の知る限り、カラーコマンドは正しくエスケープしています。ただし、コマンド履歴を上下にスクロールすると、履歴コマンドが複数行に折り返されると、行折り返しの問題が頻繁に発生します。

プロンプトを次のように簡略化しました。

PS1='\[\e[1m\]\h:\w\$ \[\e[0m\]'
PS2='> '

そして、私はまだ次のようなものを見ます:

localhost:〜/ライブラリ/ Application Support/Firefox/Profiles/knpmxpup.Defau 
 lt/extensions/{1A2D0EC4-75F5-4c91-89C4-3656F6E44B68} $ expocd\{1A2D0EC4-7 
 5F5-4c91-89C4-3656F6E export PS1 = "\ 
\e [1; 32m \]\h\[\ e [0m \]:cd Library /アプリケーションのサポート/

私も試しました\033 の代わりに \e。情報のためにそこにPS2を含めただけで、それをインストールのデフォルトから変更していません。カラーコードを完全に削除すると、すべてがうまく機能しますか?

39
Rob

Bashの行折り返しの問題は新しいものではありません。あなたのPS1はそのまま動作するはずですが、Bash 3.2.49にはバグがあります。メーリングリストを参照してください まだこれに関する別のバグ がありました 4.0で修正されることが確認されました

印刷できない文字に\[\]をタグ付けする以上のことはできません。残りはプロンプトコードで実行する必要があります。

6
TheBonsai

私は今このPS1を良い効果で使用しています:

green=$(tput setaf 2)
blue=$(tput setaf 4)
bold=$(tput bold)
reset=$(tput sgr0)
PS1="\[$green$bold\]\h\[$reset\]:\[$blue$bold\]\w\[$reset\]\$ "

コマンド履歴をスクロールすると、行の折り返しを処理できるようになりました。しかし、この質問が出されて以来、私はOS Xを10.6.3にアップデートしました

50
Rob

このstackoverflowスレッド は関連があるようです。誰かがそのスレッドで述べたように、 Bash FAQ at mywiki.wooledge.org は、Bashプロンプトでカラーコードを適切に引用する方法について説明しています( FAQ 5 )、およびターミナルの色の適切な呼び出し( FAQ 37 )。

20
willdye

シーケンスを正しくエスケープして囲んだようです。

いずれにしても、最後に「\ n」を追加するための回避策です。私はそれをより明確にし、折り返しの問題を少しでも減らします。私のPS1の正確な終わりは:

'\n\[\033[0;30m\]$\[\033[0m\]

あなたがおそらく知っている優れたハウツー:

Bash Prompt howto

2
neuro

これが私のものです。これは私が見つけた中で最高のものですが、最初に見つけたサイトにはエスケープ文字がないため、行の折り返しの問題が発生していました。私はそれをいじくり回し、最終的にそれを動作させました。これは、ユーザー、パス、およびブランチの情報を色分けしてコントラストよく表示します。

export PS1='\[\e[1;37m\]\[\e[1;32m\]\u\[\e[0;39m\]:\[\e[1;33m\]\w\[\e[0;39m\]\[\e[1;35m\]$(__git_ps1 " (%s)")\[\e[0;39m\] \[\e[1;37m\]|\[\e[0;39m\]\$'

また、追加

GIT_PS1_SHOWDIRTYSTATE=true

ブランチが「ダーティ」な場合にマーカーを表示するには(コミットする変更が存在する)

export HISTCONTROL=ignoredups

Bash履歴を上にスクロールするときに重複を無視するのにも役立ちます。

bind "set completion-ignore-case on" 

あまりにも役立ちます。

最後に、

shopt -s checkwinsize

問題が解決しない場合、OSXで役立つことがあります。

1
rcd

PS1またはPrompt環境変数に特殊文字がない場合でも、プロンプトカーソルの配置に問題があることに気付きました。

末尾に行末文字がないファイルを出力した場合。プロンプトを混乱させます。

これを再現するには、次のようにします。

curl https://Gist.githubusercontent.com/martinos/d4aa0a7d4d752b0d0d9f/raw/3198c39f84a080c44227a084a19fb3a0bb661ee5/wrapping_issue.txt

上キーを複数回押すと、プロンプトが混乱することがわかります。

実際のこの例を見ることができます:

https://asciinema.org/a/9mtjhi9dib6md4ocsbw210cca

これが発生したら、<CTRL-C>を押すだけで、プロンプトが通常に戻ります。

ZShellにはこの問題がないことに注意してください。

1
Martinos

'shopt -s checkwinsize'はCygwinのラップ問題でも機能します

0
user3375990

タイトルバートリックを使用している場合"\e]2;titlebar\a"、それもエスケープしてください:"\[\e]2;titlebar\a\]"

0
Charlie

将来の参考のために、これは私が使用するものです:

export PS1="\[\033[0;31m\][\u@Project:\w]$\[\033[0m\] "

これは私のシェルプロンプトを次のように表示します:

[ec2-user@Project:~]$

ライブサイトと開発サイトを区別するのに役立ちます。

0
Anil