Bash 5では、次のことをしたい状況に直面しました。
trap 'echo trapped!' USR1
while true; do kill -SIGUSR1 $$; sleep 1; done &
ただし、信号が送信されるたびにトラップコードを続行するには、キーボードでEnterキーを押す必要があります。
実際、私はキーボード操作なしでトラップを実行したいと思います。
編集する:
最後に、私は次のように動作させました。
trap 'echo trapped!' USR1
while true; do kill -USR1 $$; kill -INT $$; sleep 1; done &
しかし、私はこの解決策が解決策ではなく解決策だと思います。
ベストアンサー1
誰かが同様の問題を経験しているようです。ここ。
簡単に言えば、サブプロセスに組み込まれたトラップ(この場合は「エコートラップ!」)でコマンドを実行できる場合です。コマンドをファイル(たとえばa.sh
)に入れることができます。
trap 'echo trapped!' USR1
while true; do kill -USR1 $$; sleep 1; done
ファイルをバックグラウンドプロセスとして実行します。bash a.sh &
子プロセスでこれを実行できない場合は、対話型シェルがユーザーがコマンドを入力するのを待っている間にブロック読み取りを実行し、ほとんどの操作を処理できないため、良い解決策はありません。状況が発生すると信号を送信します(ご存知のようにSIGINTを処理します)。上記の解決策は、トラップが非対話型シェルにあるために機能します(したがって信号を受信したときに読み取りブロックされていません)。