\bの最後にバックスペースを使用しないのはなぜですか?

\bの最後にバックスペースを使用しないのはなぜですか?

CentOS では、以下を使用します。

[root@localhost sbin]# echo -e "ab\bc"
ac

\bバックスペースキーを表します。

しかし、私が使用するとき:

[root@localhost sbin]# echo -e "abc\b"
abc

印刷されているのにabcなぜバックスペースではないのですか?

答え1

バックスペースキー自体は破壊的ではありませんが、ほとんどのエディタ(コマンドラインを含む)はそれを表示します。実際に何が起こるのかは、これらのプログラムが対話するときにカーソルをバックアップしてから空白を書き、再度バックアップしてカーソルを正しく配置することです。

したがって、あなたの行はおそらくecho -e "abc\b \b"動作します。

次のようにしてこれをテストできますecho -n -e "abc\b"(-nは次の行への自動ジャンプを削除します)。これで、プロンプトに「c」が含まれます。

\nこれは、「次の行に移動(マージンではない)を意味する」および「マージンに移動(次の行ではない\r)を意味する」と多少似ています。オペレーティングシステムはこれらの文字を別々に解釈します(Unixは\ nに次の行を追加し、DOSには両方の文字があるなど)。

答え2

はい、期待どおりに動作します(x文字が削除されました)。

$ echo -e 'ax\bc'
ac

はい、したがってバックスペース文字が失われたようです。

$ echo -e 'abx\b'
abx

バックスペース文字(\b)はキーボードキーと同じではありませんBackspace
キーボードBackspace^?印刷された内容Ctrl-VBackspace
多くの編集者は、これを後にして文字を削除すると解釈します。これは、単にスペースを印刷するよりも複雑です。消去された各文字に対して、右側の行全体を左側に1行移動する必要があります(ワイド文字の場合は2つ、制御文字の場合は0)。または、削除された文字が新しい行を置き換えるには、行全体を1行上に移動します。いいえ、それは単なる文字ではありません。キーボードキーに接続されたプログラム全体ですBackspace

ただし、いいえ、バックスペース文字は実際にコンソールに書き込まれます。
次のコマンドを使用して、コンソールに送信される内容を確認できますod

$ echo -e 'abx\b' | od -vAn -tx1c
  61  62  63  08  0a
   a   b   x  \b  \n

それではどうなりますか?

  1. 文字列がabxコンソールに書き込まれます。
  2. コンソールはabxラインバッファとして印刷します。
  3. 役割が\bコンソールに記録されます。
  4. この文字は\bコンソールラインバッファを1文字後ろに移動します。
  5. この文字は\nコンソールに印刷されます。
  6. コンソールラインバッファは次の行に移動します(何も印刷されません)。
  7. 「文字列の終わり」がコンソールに印刷されます。
  8. コンソールはラインバッファ全体を出力します。

これがコンソールが機能する基本的な方法です。

確認してください:

$ printf 'abcdef\b\b\b \n'
abc ef

これはdスペースで置き換えられた文字です。

xをなぜ'ax\bc'削除しますか?

c文字が文字を上書きするためですx

関連情報