インタラクティブに入力されたバックスペースはいつ入力に渡されますか?

インタラクティブに入力されたバックスペースはいつ入力に渡されますか?

catリダイレクトを介してクイックテストファイルを生成するとき(サンプル入力を使用するなど)、システムごとに異なる動作が表示されることを確認しました。

私が言っていることを理解するには、次の手順に従ってください。

ランニングcat > testfile

と入力helliし、バックスペースを押してから、と入力しますo

エンターキーを押してください。

入力を終了するには、Ctrl-Dと入力してください。

ランニングod -a testfile

Macなどの一部のシステムでは、次のことができます。

0000000    h   e   l   l   o  nl                                        
0000006

WindowsでMobaXtermを介してログインしたRHEL 5.7ホストなどの他のシステムでは、次のことができます。

0000000    h   e   l   l   i  bs   o  nl                                        
0000010

この違いを生み出すコードはどこにありますか?たとえば、上記の例ではMobaXtermまたはRHEL 5システムを疑う必要がありますか?それとも、キーボードとファイルシステムの間にどのレイヤがありますか?


これは実際の質問よりも好奇心に近い質問です。明らかに、テキストエディタを使用してバックスペース文字なしでファイルを生成できましたが、過去にこれが間違っていました。一度はカジュアルなデモ/トレーニング中にファイルを生成するときにそのような問題があると述べましたがcat、バックスペース文字は文字通り処理され、最終的にそのような効果がない場合にのみエラーを表示しました。学生Macで。 だから気になりますね。

答え1

これは、a)BackSpaceキー(^H/BSまたは^?/ DEL)を押したときに端末エミュレータが送信する文字とb)ttyドライバが使用する文字(VERASE後者を変更するには - を参照して使用)によって異なります。stty(1)stty erase ^H

ターミナルエミュレータが送信中である^Hがttyが特殊文字として認識されない場合、BackSpaceキーを押すと画面の最後の文字が視覚的に「削除」されますが、[1]文字はそのまま(文字とともに)送信されます。 tty() から読み取るプロセスにcat

行編集機能を備えたエディタおよびインタラクティブプログラムは、ttyをrawモードに設定し、特殊文字自体を処理し、等しくないものとして^H扱うことができます。 ;-)^?cat

echoctl stty[1]これは設定によって異なります。設定されている場合、端末は形式"^"+chr(char^0x40)^HforBS = 8など)で制御文字をエコーし​​ます。

答え2

catシェルの端末機能を操作するコマンドを使用して、表示される動作を再現できますstty

端末が標準モードの場合、入力はラインとして収集され、ライン編集が有効になり、オプションでstdinが画面に表示されます(IEXTENフラグ)。

非正規モードでは、一部の制御文字がシェルに渡されます。

例:

stty -icanon
cat > testfile # end with ctrl-c
#typed ls | space | backspace | ctrl-h | al | ctrl-d | ctrl-c
od -a testfile
0000000   l   s  sp del  bs   a   l  nl eot
0000011

標準モードを復元するには:

stty icanon

現在の端末装置を照会します。

stty
# OR for more info
stty -a
speed 9600 baud; rows 62; columns 255; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

コマンドのフラグ部分の出力は次のようになります。以前の表示フラグが設定されていないため、-標準フラグに対してicanon設定および解除されます。-icanon

マニュアルページから:

オプション - 否定を示すために前にSETTINGが続きます。 *POSIX以外の設定を表示します。

関連情報