2016-04-24 8 views
5

stdinから行を読み込んで、行の内容に基づいていくつかの操作を実行するスクリプトがあります。そのスクリプトにキーをバインドする必要があるので、単にCtrl-tをタイプするだけで呼び出すことができます。スクリプトをその名前で呼び出すと、期待どおりに動作しますが、キーバインディングを押すとハングします。実際にはシェルがぶら下がり、私はそれを殺さなければなりません。スクリプトはread -r lineを使用します。私はcatと同じ結果を試しました。stdinを読み込むコマンドにキーをバインドする

スクリプトは、この(ファイル名read.sh)のようになります。このような

#!/bin/bash 

echo -n ' > ' 
read -r buf 
echo "you typed $buf" 

バインド:あなたはCtrlキー + トン対を押したときに

bind -x '"\C-t" : "read.sh"' 
+0

あなたが試したものを正確に投稿できますか? – andlrc

答えて

2

あなたの端末の設定が異なっていますターミナルからスクリプトを起動するだけです。

echo Terminal settings: "$(stty -a)" 

今すぐ自身でスクリプトを実行し、その後はCtrl + トンを押すことによって、それを実行:あなたはread.shに次の行を追加した場合、それはあなたの端末の設定を印刷します。いくつかの相違点に気づくでしょう。最も大きなものは-echo-icrnlの追加で、エコーをオフにして改行処理を変更します。これにより、スクリプトがぶら下がって見えるようになります。

スクリプト内でこの問題を修正するには、ttyを正規モードに戻してエコーを再追加します。 sttyの変更を行う前に、スクリプトが終了したら設定を保存して復元する必要があります。これにはtrapを使用できます。

#!/bin/bash 
# Save the tty settings and restore them on exit. 
SAVED_TERM_SETTINGS="$(stty -g)" 
trap "stty \"${SAVED_TERM_SETTINGS}\"" EXIT 

# Force the tty (back) into canonical line-reading mode. 
stty cooked echo 

# Read lines and do stuff. 
echo -n ' > ' 
read -r buf 
echo "you typed $buf" 
+0

優れた答え。ありがとう! –