他のプロセスが実行されるのを待たずにユーザー入力を聞きます。

他のプロセスが実行されるのを待たずにユーザー入力を聞きます。

さて、次のような構造を持つ単純なスクリプトがあります。無期限に実行されるサブプロセスがあります。現時点では、ユーザーがプロセスを手動で終了したときにのみ停止します。電話を切らずにユーザーの入力を聞く方法があるかどうか疑問に思いますread。つまり、子プロセスの実行中にユーザーが\n端末に「quit」と入力するかどうかをバックグラウンドで確認します。

...

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条件で変数を使用し、「終了」になるまでこれを行うことができることを知っていますが、その変数を入力に設定することは私が失った場所です。

答え1

を使用してバックグラウンドでプロセスを実行&し、readユーザーのバックグラウンドで実行し、どちらかが完了するのを待つこともできます。あなたは次のように終わります

mylongrunningcommand &
pid1=$!
echo "enter quit to stop"
while read reply && [ quit != "$reply" ]
do  :
done </dev/stdin &
pid2=$!
wait -n
echo "got quit or command done"
kill -9 $pid1 $pid2
wait

readループ内にあるので、「quit」を数回入力してみることができます。背景のため、標準入力をリダイレクトする必要があります。バックグラウンドジョブのいずれかが完了すると返されwait -n、どのジョブが完了したかわからないため、killは両方のジョブのプロセスIDを終了します。

上記のコードは、終了したプロセスに対してbashからいくつかのメッセージを生成します。これを抑制するには、最後の2行を次に置き換えます。

exec 3>&2 2>/dev/null
kill -9 $pid1 $pid2
wait
exec 2>&3 3>&-

それから一時的にstderrが/dev/null

関連情報