さまざまなアプリケーションでこれに気づいたことがあります。出力が早期にキャンセルされた(たとえばctrl + cなど)、またはzshが改行文字を埋めていることが原因であるとよく考えていました。しかし、好奇心は私にとって最高のものになりました。それはbashでこれを行うようには見えないからです。
zsh
bash
Sequence
プログラムは、Java認定を読んでいるときに本から引き出したものであり、コンパイルして実行するかどうかを確認したいと思っていました。 _System.out
_パッケージ/クラスのprintln()
メソッドではなく、プレーンな古いprint()
を使用します。
この記号が表示されるのは、改行文字がないことが原因ですか?
はい、これは「部分的な行」であるために起こります。そしてデフォルトでは zshは次の行に進み、プロンプトでそれをカバーしないようにします 。
部分的な行が保持される場合、デフォルトでは、部分的な行の終わりに逆+太字が表示されます。通常のユーザーの場合は「%」、rootの場合は「#」です。設定されている場合、シェルパラメータPrompt_EOL_MARKを使用して、部分的な行の終わりの表示方法をカスタマイズできます。
これは、コマンドの出力で終了していない行を明確に表示できるようにするzsh
(および現在はfish
も)の特定の機能です。
従来のシェルでは、コマンドが最後の改行文字の後にデータを出力した場合、つまり、コマンドが行末にnotを残した場合、シェルによる次のプロンプトは終了します次のように、最後の終了していない行に追加されます。
bash-4.4$ printf XXX
XXXbash-4.4$
これはプロンプトを壊します。特に、そのようなより洗練されたプロンプトを持っている場合は、XXX
を見逃しがちです。また、カーソルの位置にも影響し、カーソルを移動すると表示に不具合が発生します。
zsh
は、出力に%
文字が太字で反転したビデオで終了していないことを示し、次のプロンプトを次の行の先頭に発行することで、これを回避します。
zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$
everyコマンドの最後に(各プロンプトの前に)その逆のビデオ%
を出力し、その後に79スペース(80文字幅の端末を想定)、CR文字(カーソルが最初の列に戻る原因となる行)と、シーケンスが行の終わりまで消去されます(その後プロンプト)。
このように、終了していない行があった場合、カーソルは最初の位置にないため、それらの80文字により、カーソルはnext行に移動します(そして%
は残ります)。そうでない場合、その%
と79個のスペースは1行になり、後で削除されます。
現在は、ターミナルが行を折り返す場合にのみ機能します(たとえば、tput rmam
の後で正しく機能しません)。遅い端末(9600ボーシリアルラインなど)を使用している場合、実際には%
が表示され、各コマンドの後に削除されるので、zsh
を使用してその機能を無効にできます。
unsetopt Prompt_cr Prompt_sp
そうすれば、zsh
は従来のシェルのように動作します。
$Prompt_EOL_MARK
変数を使用してそのマークを変更することもできます。