バックスペースは実行中のbashスクリプト内では機能しません


8

1行ずつ読み取り、入力した行をターミナルに出力する非常に単純なスクリプトを実行しています。

while read CMD; do
    echo $CMD
done

正常に動作しますが、backspace文字を含む行を編集しようとすると、文字^?を削除する代わりに印刷されます。Ctrl+ を押すとbackspace、出力はになり^Hます。この動作を修正してbackspace、これらの文字を追加する代わりに文字を削除するにはどうすればよいですか?stty erase '^?'コマンドを試しましたが、うまくいきませんでした。


16.10が先月サポートサイクルの終わりに達したことに注意してください。できるだけ早く17.04にアップグレードする必要があります。
バイトコマンダー

1
私は交換することをお勧めread CMDread -e CMD
Cyrus

1
terminator代わりに試してくださいgnome-terminal。期待どおりに機能
Severus Tux 2017

1
@whtygerこれはこのスクリプトで機能しました。私の実際の状況では、readを呼び出さないプログラムからの入力があります。プログラムスクリプトを変更する機会はありません。これは、私の問題を表す例にすぎません。すべての入力に対してこの構成を実行できるグローバル設定はありますか?
vrom911 2017

1
@Cyrus My Backspaceは思いどおりに機能し-eます。このスクリプトの場合でも、オプションのない質問からは常に最後の文字が削除されます。しかし、@ vrom911のマシンではそうではありません。なぜそれが起こるのか、これをどこで設定できるのかと思います。
シャーシュ2017

回答:


6

問題は、バックスペースを表す方法はたくさんありますが、readコマンドがそれらすべてを理解できないことです。← Backspace端末エミュレータの設定でキーを押したときに、何が送信されるかを正確に設定できるはずです。

gnome-terminalエミュレータとして使用していると仮定して、編集マニュを開いて[ プロファイル設定 ]をクリックします。[ 互換性 ]タブに切り替えると、次のオプションが表示されます。

gnome-terminal→プロファイル設定→互換性

これで、Backspaceキーが生成する設定を変更できます。以下の5つのオプションから選択できます。私は中括弧でそれらが私のシステムでどのように動作するかを追加しました:

  • 自動(動作)
  • Control-H(^H代わりに印刷)
  • ASCII DEL(デフォルト、機能)
  • エスケープシーケンス(^[[3~代わりに印刷)
  • TTY消去(機能)

現在、ASCII DELを使用しています。5つのオプションをすべて試しましたが、どれも問題を解決しませんでした。
vrom911 2017

変です。何を言っているのかtype read、どのシェル/バージョン$SHELL --versionレポートを使っているのか教えていただけますか?
バイトコマンダー

私はそれが奇妙であることを知っています。私は自分の問題をグーグルでググるように試みましたが、私に役立つ解決策が見つかりませんでした。type readと言うread is a shell builtin。そして$SHELL --version言うGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
vrom911 2017

1

Gnomeターミナルでbashを使用して、同じ問題が発生しました。

コマンドラインでは、バックスペースは期待どおりに機能しますが、私のプログラム(単純なTCPソケットベースのチャットクライアント)がstdinから読み取っている場合、最後の文字を削除する代わりに、backspace文字が印刷されます(画面にエコーバックします)^?

# stty icanon「標準(調理済み)モード」を許可するために使用します。ここでいくつかの説明を参照してください/unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal

問題/解決策の背景:4,000文字以上を貼り付ける必要があるという問題がありました。そしてその研究中に、私は上記のリンクに導かれました。以前# stty -icanonは4kの制限を無効にしていましたが、バックスペースを使用できなくなりました(消去)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.