bashでbackspaceが動作しない場合の対処

bashでbackspaceが動作しない場合の対処

Posted at April 11,2021 11:55 PM
Tag:[bash]

bashでbackspaceが動作しない場合の対処方法を紹介します。

1.問題点

入力した文字を表示するという、簡単なスクリプト(test.sh)を作ってみました。

#!/bin/bash
 
while [ 1 ]; do
    read -p "> " line
    echo "$line"
done

このスクリプトで入力した文字をbackspaceで削除しようとすると、"^H"が表示されます。

# ./test.sh
>abc^H^H^H

ということで、bashでbackspaceが動作しない場合の対処方法を紹介します。

2.原因

まず、"stty -a"を入力して、端末設定を表示(抜粋)します。

# stty -a
speed 38400 baud; rows 24; columns 98; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;

1文字消去のキーバインドは、

erase = ^?;

となっていますが、bashのbackspaceは"^H"が割り当てられています。

このため、backspaceを押下しても、割り当てられたキーが存在しないため、1文字消去ではなく、"^H"がそのまま表示されると思われます。

3.対処

スクリプト実行時にsttyコマンドを実施して、eraseのキーバインドをbackspaceに変更します。

#!/bin/bash
 
stty erase '^H'
 
while [ 1 ]; do
    read -p "> " line
    echo "$line"
done

追加するのは、

stty erase '^H'

の部分で、"^H"はシングルクォーテーションで括ります。

あるいはそのままの文字を入力したい場合、クォートせずに、Ctrl-v → Ctrl-hを入力します。

3.元のキーバインドに戻す

スクリプト内で設定したキーバインドは、終了後のターミナルに伝播されませんが、何らかの原因で戻らない場合、スクリプトの最後に、

stty sane

あるいは、

stty erase '^?'

を入力します。

#!/bin/bash
 
stty erase '^H'
 
while [ 1 ]; do
    read -p "> " line
    echo "$line"
done
 
stty sane

'^?'を直接入力したい場合は、クォートせずに、Ctrl-v → Ctrl-8を入力します。

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)