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
それではどうなりますか?
- 文字列が
abx
コンソールに書き込まれます。 - コンソールは
abx
ラインバッファとして印刷します。 - 役割が
\b
コンソールに記録されます。 - この文字は
\b
コンソールラインバッファを1文字後ろに移動します。 - この文字は
\n
コンソールに印刷されます。 - コンソールラインバッファは次の行に移動します(何も印刷されません)。
- 「文字列の終わり」がコンソールに印刷されます。
- コンソールはラインバッファ全体を出力します。
これがコンソールが機能する基本的な方法です。
確認してください:
$ printf 'abcdef\b\b\b \n'
abc ef
これはd
スペースで置き換えられた文字です。
xをなぜ'ax\bc'
削除しますか?
c
文字が文字を上書きするためですx
。