私の bash スクリプトでは、$cmd
変数に格納されている外部コマンドを実行しています。(単純なbashワンライナーでさえ、何でもかまいません。)
ctrlスクリプトの実行中に+が押された場合C、現在実行中のスクリプトを強制終了したいのです$cmd
が、メイン スクリプトの実行を続行する必要があります。ctrlただし、メイン スクリプトの実行中に+でメイン スクリプトを強制終了するオプションを保持したいと考えていますC。
#!/bin/bash
cmd='read -p "Ooook?" something; echo $something; sleep 4 '
while true; do
echo "running cmd.."
eval "$cmd" # ctrl-C now should terminate the eval and print "done cmd"
echo "done cmd"
sleep 5 # ctrl-C now should terminate the main script
done
素敵なbashの方法でそれを行う方法はありますか?
回答に基づいて適用される変更:
#! /bin/bash
cmd='read -p "Ooook1?" something; read -p "Oook2?" ; echo $something; sleep 4 '
while true; do
echo "running cmd.."
trap "echo Interrupted" INT
eval "($cmd)" # ctrl-C now should terminate the eval and print "done cmd"
trap - INT
echo "done cmd"
sleep 5 # ctrl-C now should terminate the main script
done
では、 「おーっ1?」と言いながらctrl+を押して Cread は、その読み取りが完了した後にのみ評価を中断します。(「Oook2」の直前で中断します) ただし、「sleep 4」で即座に中断します。
どちらの場合でも、正しいことを行います-evalサブシェルを中断するだけなので、ほとんどそこにいます-ちょうどその奇妙な読み取り動作..