web-dev-qa-db-ja.com

このbashコマンドラインをクリアするために12文字を挿入する必要があるのはなぜですか?

Xtermターミナル(80列x 24行)を開き、$ bash --norc --noprofile、次に$ ttyを実行してターミナルのファイル名を取得します。出力は/dev/pts/9です。

別のターミナルから私は実行します:

$ printf foo >/dev/pts/9

fooは、最初のターミナルのシェルコマンドラインに出力されます。
C-uを押してunix-line-discard$ bind -P | grep -i c-uで指定された関数の名前)を実行しても、fooは削除されません。
11個のスペースを挿入してC-uを押すと、スペースは削除されますがfooは削除されません。
12個のスペースを挿入してC-uを押すと、スペースとfooが削除されます。

enter image description here

カーソルが直後にあるときにC-uを押すとfooを削除できないのはなぜですか。削除するために12文字を挿入する必要があるのはなぜですか。


環境:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial

$ bash --version | head -n1
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)

$ xterm -version
XTerm(322)
14
user938271

他のいくつかのプログラムがfoo/dev/pts/9に出力する場合、通信はtty間で行われ、シェルは交換に参加せず、出力された文字数や、印刷されました。シェルはまだ、消去する文字がないと信じています。実際、ターミナルにfooを出力し、バックスペースで消去しようとしても機能しません。シェルは、存在しないと信じるものを消去しようとはしません。

--norc --noprofileコマンドを使用したターミナルで試してください。

bash-4.3$ printf 'some text'

取得するため:

some textbash-4.3$

その時点で、バックスペースは何も消去しません。また、ctrl-uは何も消去しません。いくつかの文字(最大11文字)を入力すると、ctrl-uは(バックスペースと同様に)入力されたものだけを削除します。ただし、11文字を超える場合、コマンドctrl-uは、その行の先頭と思われるものに戻り(多くの文字を消去するためのより高速な方法)、次のプロンプトが表示されます。

some textb

これはバグIMOと考えることができます(まだbash 5.0に存在します)。しかし、--norc--noprofileオプションが使用されていない場合、bash-5の20文字(OPの場合は18)に変更されます(理由を特定しようとしていないため、IMnshOのような重要な問題ではありません)。

19
Isaac