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を入力します。
Posted by yujiro このページの先頭に戻る
- シェルスクリプトのexpectで応答メッセージを振り分ける方法
- bashでPostgreSQLのselect結果を出力する方法
- bashの変数から最後の1文字を取得・削除する方法
- bashのwhile文で利用した変数がループ外で反映されない場合の対処
- bashのechoでアスタリスク「*」がワイルドカードとして展開される場合の対処
- bashの正規表現でスペース(空白)を判定する方法
- bashで文字列の長さを調べる方法
- bashで数値を判定する方法
- bashで小数点を比較する方法
- bashの配列をjoinする方法
- bashのif文で正規表現を使用する方法
- Bashで変数を大文字または小文字に変換する方法
- bashの変数をsplitして配列を作る方法
- シェルスクリプトでtelnet接続する方法
- bashで小数点を比較する方法
トラックバックURL
コメントする
greeting