Bashで非常に長いコマンドを入力すると、ターミナルが正しく入力した内容を表示しないという問題があります。私は次のようなコマンドがあると思います:
username@someserver ~/somepath $ ssh -i /path/to/private/key
[email protected]
コマンドは2行でレンダリングする必要があります。代わりに、それはしばしばラップアラウンドして、次のように私のプロンプトの上に書き始めます:
[email protected] -i /path/to/private/key
戻って引数を変更することにした場合、カーソルが表示される場所がわかりません。プロンプトの中央に表示されることもありますが、通常はaboveと入力します。
私がいつ Up 前のコマンドに。私はこれをgnome-terminalとterminatorの両方で、そしてi3とCinnamonで試しました。誰かがそれが私のプロンプトであると提案したので、ここにそれがあります:
\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
Ctrll、reset
、およびclear
はすべて彼らが言うことを実行しますが、コマンドを再度入力するか、 Up 同じことが起こります。
私がチェックしたところ、bashでcheckwinsize
が有効になっています。これは、80x24およびその他のウィンドウサイズで発生します。
これは私が一緒に暮らすことを学ぶだけのものですか?知っておくべき魔法がありますか?私は本当に短いプロンプトを使用することで解決しましたが、それでも問題は解決しません。
印刷不可能なシーケンスは \[
および\]
で囲まれている である必要があります。あなたのPS1を見ると、\W
の後に囲まれていないシーケンスがあります。ただし、2番目のエントリは冗長であり、前のステートメント "1; 34"を繰り返します。
\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
|_____________| |_|
| |
+--- Let this apply to this as well.
そのため、これは意図した色付けである必要があります。
\[\033[1;32m\]\u:\[\033[1;34m\] \W \$\[\033[0m\]
|_____|
|
+---- Bold blue.
"original"を保持することもこれでうまくいくはずです:
\[\033[1;32m\]\u:\[\033[1;34m\] \W\[\033[1;34m\] \$\[\033[0m\]
|_| |_|
| |
+-----------+-- Enclose in \[ \]
この動作の理由は、bash
はプロンプトが実際よりも長いと信じているためです。簡単な例として、もし使用するなら:
PS1="\033[0;34m$"
1 2345678
プロンプトは1ではなく8文字であると考えられています。そのため、ターミナルウィンドウが20カラムの場合、12文字を入力すると、20文字で折り返されます。これは、バックスペースを実行しようとした場合や、 Ctrl+u。 9桁目で停止します。
ただし、最後の列にない限り、新しい行は開始されません。その結果、最初の行が上書きされます。
入力を続ける場合、32文字の後、行は次の行に折り返されます。
ほとんどの場合、端末が想定するウィンドウのサイズが実際のウィンドウサイズと同じではありません。 bashを使用している場合は、これを試すことができます。
$ shopt checkwinsize
あなたが得ないなら
checkwinsize on
次に、それをアクティブにします
$ shopt -s checkwinsize
次に、別のコマンド(ls
など)を実行するか、ウィンドウのサイズを1回変更するだけで、上記はいつでもうまくいきます。
特にRedhatシステムの場合、この問題は~/.bashrc
を呼び出さないように/etc/bashrc
を誤って設定したことが原因であることがよくあります。通常、bashは~/.bashrc
をロードします。これは、デフォルトで/etc/bashrc
を含むshopt -s checkwinsize
を呼び出すことが想定されています。
私はかつてどこかを読んだことがある(もうどこか分からない)\001
および\002
の代わりに \[
および\]
はこの問題を解決できます。それは私のためにした。
ちなみに、PS1の定義は見苦しくなくてもかまいません。
green="\001$(tput setaf 2)\002"
blue="\001$(tput setaf 4)\002"
dim="\001$(tput dim)\002"
reset="\001$(tput sgr0)\002"
PS1="$dim[\t] " # [hh:mm:ss]
PS1+="$green\u@\h" # user@Host
PS1+="$blue\w\$$reset " # workingdir$
export PS1
unset green blue dim reset
他の回答で述べたように、\e[0;30m
などの印刷不可能なシーケンスは\[...\]
でラップする必要があります。
さらに(そして私がまだ言及していないこと)、複数行のプロンプトがある場合、\r\n
は\[...\]
の-outsideである必要があるようです。最終的にそれを理解するには、試行錯誤が必要でした。
これは、COLUMNS
&LINES
環境変数の設定に問題があるようです。ウィンドウのサイズを変更すると、通常はgnome-terminalによって自動的に設定されます(私はそう思います)、コマンドresize
を発行して強制的に手動で設定することができます。
Gnome-terminalのサイズを79x17に変更すると、変数は次のように表示されます。
$ echo $COLUMNS; echo $LINES
79
17
私はそれを次のように強制できます:
$ resize
COLUMNS=79;
LINES=17;
export COLUMNS LINES;
折り返しを防ぐために、たとえば、使用して列の数を増やすこともできます。
stty columns 120
また、幅広いユニコードシンボルを使用することで同じ問題が発生する可能性があります( https://stackoverflow.com/a/34812608/1657819 など)。これは問題を引き起こしているスニペットです($Green
および$Red
は適切にエスケープされた色の文字列です):
FancyX='\342\234\227'
Checkmark='\342\234\223'
# Add a bright white exit status for the last command
PS1="$White\$? "
# If it was successful, print a green check mark. Otherwise, print
# a red X.
if [[ $Last_Command == 0 ]]; then
PS1+="$Green$Checkmark "
else
PS1+="$Red$FancyX "
fi
Bashは長さを正しく計算できないため、これらのワイドシンボルの3つの部分のうち2つをエスケープするのが最も簡単な方法です。
FancyX='\[\342\234\]\227'
Checkmark='\[\342\234\]\223'
tput smam
Ubuntu 19.10のTERM=xterm-256color
を含むGnomeターミナルでは、ターミナルが行を折り返す正確なエスケープシーケンスを発行します。
tput smam
あなたはそのエスケープが何であるかを見ることができます:
tput smam | hd
次のコマンドを使用して端末状態をリセットします。
reset
tput smam
を設定する効果もあるようです。
Manページ:
man terminfo
ドキュメントsmam
およびその反対のrmam
:
enter_am_mode smam SA turn on automatic margins
exit_am_mode rmam RA turn off automatic margins
ただし、特定の端末にはその機能がないことに注意してください。 tmux
の内部にはTERM=screen-265color
があり、smam
は機能のリストに表示されません。
infocmp
したがって、tput smam
は何も出力しません。
方法はわかりませんが、 QEMUはtput
がなかったときにtmuxの行の折り返し状態を変更できました 。