bashでbackspaceが動作しない場合の対処
小粋空間 » Programming Language » bash » bashでbackspaceが動作しない場合の対処
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を入力します。