シェルでバックスペースを押すとカーソルが右に移動する

シェルでバックスペースを押すとカーソルが右に移動する

ログインしているリモート シェルでは、文字を削除しようとすると、削除された文字が視覚的に表示されずに、文字はそのまま残り、カーソルが右に移動します。このシェルは Bash を実行しています。

たとえば、 と入力して1 回echoo押すとBackspace、プロンプトは次のようになります: echoo。ただし、実際には、表示されている文字は正しい ( echo) ので、 を押すとEnterコマンドは正常に実行されます。

私の知る限り、それは開かれた問題と全く同じですここ私も Kubernetes 経由で接続しています。実行するコマンドは次のようになりますkubectl -n <some_kind_of_argument> exec -it <another_argument> -- bash

他の質問を読んでみると、以下の情報が役に立つことがわかりました。


root# echo $TERM
xterm

これは、ローカル シェル ( xterm-256color) によって出力される値とは異なります。次の方法では問題は解決されません。

root# export TERM=xterm-256color

ここで、 の出力を共有しますstty -a

root# stty -a
speed 38400 baud; rows 43; columns 118; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; 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

ここで、Ctrl+を押しvてから を押すと、Backspace次のように表示されます。

root# ^?

これは上記の出力と一致しているようです ( erase = ^?)。上記のプロンプトで Enter キーを押すと、次のように出力されます。

bash: $'\177': command not found

私も走りましたstty saneが、効果はありませんでした。


誰かこの問題を解決するのを手伝ってくれませんか?そして、何が起こっているのか理解するのを手伝ってくれませんか?

答え1

使用しているリモートシェル/アプリケーションは、バックスペースを送信することを期待しています^H(通常、カーソルを1セル左に移動します)。ターミナルシェル/アプリケーションは文字を消去するためにスペースを出力します。しかし、^?(ASCII DEL、コード127)は期待していません。これは通常、カーソルを移動しません。ターミナル

ただし、実際には、存在する文字は正しい (エコー) ので、Enter キーを押すとコマンドは正常に実行されます。

質問のコメントでは、シェル/アプリケーションは実際には^?消去文字として処理すると述べていますが、ある意味ではハードコードされている可能性があります。ただし、ハードコードされていない場合は、設定に注意を払う可能性がありますstty。そうであれば、(リモート)シェルの初期化でこれを行うことができます。

stty erase ^H

(実際の制御/ H...) を使用し、ControlHの代わりにを使用します (または、ではなくBackspacesend に端末構成を変更します)。^H^?

関連情報