2016-09-07 9 views
0

私は下の構造を持つ単純なスクリプトを持っています。私は不定期に実行されるこのサブプロセスを持っています。現時点では、ユーザーがプロセスを手動で強制終了するときにのみ停止します。私はread行にこだまずにユーザーからの入力を聞く方法があるのだろうかと思っていました。つまり、サブプロセスが実行されている間、バックグラウンドで、ユーザーがターミナルに「quit \n」と入力したかどうかを確認します。BASH:他のプロセスを待つことなくユーザの入力を聞きます。

... 

if [[ option = "3" ]]; then 
    while [2 -lt 4]; #THIS IS WHERE I WANT TO CHANGE TO LISTENING FOR INPUT TO QUIT 
     #Some sub process that continues to run 
    done 
fi 

.... 

ありがとうございます!申し訳ありませんが、これはひどく言われている場合、私は問題を説明するためのより良い方法を考えることができませんでした。私のブレインストーミングの試みに関しては、whileの変数を使用して、 "quit"に等しくなるまでこれを行うことができます。しかし、その変数を入力に設定すると、私は迷うことになります。

+0

サブプロセスはターミナルと対話する必要があります(つまり、特に入力を読み取ったり、出力を生成する)か、それともユーザーとやりとりする方法が異なるプロセスですか、たとえばX11 GUIインターフェイス? – wojtow

+0

@wojtow、そうではありません。これは、端末に物を印刷しますが、ユーザとはまったくやり取りしません。実際には、ユーザーは 'Ctrl' +' C'でも停止することはできません。助けてくれてありがとう! –

答えて

0

私が正しく理解しているかどうかわかりませんが、このようなものをお探しですか?

while [[ 2 -lt 4 ]] ; do 
     read -t .1 user_input 
     [[ ${user_input} == "exit" ]] && exit 0 
done 

またはおそらく単純:一般的に

unset user_input 
while [[ "${user_input}" != "exit" ]] ; do 
     read -t .1 user_input 
done 

あなたはおそらく、あなたが​​で欲しいものを達成することができます。

-tタイムアウト 原因は、アウト時に読み込まれ、入力(または文字のspec- ified数)の完全なラインがタイムアウト秒以内に読まれていない場合は失敗を返します。タイムアウトは、小数点以下の小数部を含む の小数です。この オプションは、読み取りが端末、パイプ、または他の 特殊ファイルからの入力を読み取っている場合にのみ有効です。通常のファイルから読み込むときは効果がありません。読取り時間が の場合、readは指定された変数名に部分読取り値を保存します。 タイムアウトが0の場合、データを読み取ろうとせずにreadがただちに戻ります。 の終了ステータスは、入力が指定されたファイル記述子で使用可能な場合は0、それ以外の場合は0以外です。 タイムアウトを超えた場合、終了ステータスは128より大きくなります。

+0

これは完璧に聞こえる!おかげさまで@wisent!サブプロセスが端末を制御する場合、これは機能しますか?私が尋ねる理由は、それがsshをしようとしているからです。その範囲が重要かどうかはわかりません。申し訳ありません、私はbashを初めて使っています!とにかく、チップのおかげで、私はそれを試してみましょう! –

関連する問題