2011-09-04 11 views
3

私は次のようでした:それは結構働いてbashスクリプトでは、関数にキーをバインドする方法はありますか?

#! /bin/bash 
a=2 

function up_a() { 
    a=$((a+1)); 
} 

while (true); 
do 
    echo "a=$a"; 
    up_a; 
    sleep 1; 
done 

$ ./test.sh 
a=2 
a=3 
... 

を今、私は次のことを試してください。

#! /bin/bash 
a=2 

function up_a() { 
    a=$((a+1)); 
} 

bind -x '"p": up_a'; 

while (true); 
do 
    echo "a=$a"; 
    sleep 1; 
done 

私はそれをテストする場合:

$ . test.sh 

a=2 
a=2 
... 

は(私は「P」キーを数回押す)

何が問題になっています(私はsourceまたは.と「輸入」bindコマンドを使用するスクリプトに必要)?

答えて

6

bindを使用するキーバインディングは、対話的なテキスト入力(readlineライブラリ)にのみ影響します。プログラムを実行するとき(組み込みのwhileでも)、端末は標準の "cooked"モードに切り替えられ、入力は現在実行中のプログラムに与えられます(この場合、入力はsleepに入力されます)。

は手動鍵を読むことができます:あなたはwhileループを実行し、同時に入力を読みたい場合は

read -N 1 input 

echo "Read '$input'" 

しかし、あなたは別のプロセスでそれを行う必要があります(bashはありませんスレッドをサポートしていません)。変数はプロセスにとってローカルなので、最終結果はかなり複雑になるはずです。

関連する問題