12

一般的なLinux端末のバックスペース文字が、印刷されたときに実際に文字を消去しないのはなぜだろうか(通常、入力すると機能します)。

これは期待どおりに機能します。

$ echo -e "abc\b\b\bxyz"
xyz

(バックスペースとして評価され、 + +\bとしても挿入できます- ( )としてレンダリングされます)CtrlV CtrlH^H0x08

しかし、バックスペースの後に文字が少ない場合、奇妙な動作が明らかになります:

$ echo -e "abc\b\b\bx"
xbc

バックスペースではなく左矢印キーのように動作します。

$ echo -e "abc\e[D\e[D\e[Dx"
xbc

ラインバックの消去は正常に機能します:

$ echo -e "abc\e[1Kx"
x

実際、ターミナルでCtrl+を入力すると、ではなく( )が生成されます。V Backspace^?0x7f^HDelCtrlV Del<ESC>[3~

印刷されたバックスペース文字が文字を消去しない理由を誰かが説明できますか?

(私の環境は xterm Linux で、その他の端末エミュレータも$TERM== xterm、試しvt100てみLinuxました)

4

1 に答える 1

23

あなたが見ているものは正しいです。バックスペースキーを押すか^H、カーソルを左に移動します。消去はしません。文字を消去するには、出力する必要があります^H ^H(Backspace-Space-Backspace)。


コメントに答えるには-バックスペースは、VT100 / ANSIファミリの端末でそのように定義されており、そこから多くの端末制御コードシーケンスが借用されます。BSの機能を「左マージンにある場合を除き、カーソルを左1文字の位置に移動します。この場合、アクションは発生しません」と定義されているVT100ユーザーマニュアルを参照してください。言い換えれば、それは歴史の癖です:)

最初にこのように定義された理由については、上記のように破壊的なバックスペースを実装できるため、非破壊的なカーソル移動制御コードを使用する方が柔軟だと思います。

于 2010-05-18T10:32:40.590 に答える