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
が削除されます。
カーソルが直後にあるときに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)
他のいくつかのプログラムが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のような重要な問題ではありません)。