次のように、forループで2つのコマンドを実行するスクリプトを作成しようとしています。
#!/bin/bash
for ((i=0; i<2; i++)); do
sudo ./bin/llc test-rx -c 184
sleep 5
trap ctrl_c INT
function ctrl_c()
{
echo "Trap: CTRL+C received, exit"
exit
}
sudo ./bin/llc rxphylast
done
最初のコマンド(test-rx)は実行時に実行され続け、Ctrl + Cを押すと停止します。 bashスクリプトでこのコマンドを停止したいので、コードに示されているようにトラップ機能を使用しました。ただし、スクリプトを実行すると、Ctrl + Cを押すまで最初のコマンドが実行され、2番目のコマンド(rxphylast)が実行されます。だから私の場合、トラップ機能は機能しません。スクリプトの最初のコマンドを停止する方法に関する提案はありますか?
答え1
- 関数を定義し、ループの外側にトラップを設定します。
- 機能を使用する前に定義してください。
努力する:
#!/bin/bash
function ctrl_c() (
{
echo "Trap: CTRL+C received, exit"
exit
}
trap ctrl_c INT
for ((i=0; i<2; i++)); do
sudo ./bin/llc test-rx -c 184
sleep 5
sudo ./bin/llc rxphylast
done
./bin/llc を使用しない別の例:
#!/bin/bash
function ctrl_c()
{
echo "Trap: CTRL+C received, exit"
exit
}
trap ctrl_c INT
for ((i=0; i<2; i++)); do
echo first program
sudo find / -type f > /dev/null
sleep 5
echo second program
sudo find / -type f > /dev/null
done
最初のプログラムfind
の実行中にCtrl-Cを押すと、「Trap:CTRL + C received、exit」というメッセージが表示され、すぐに終了します。 2回目find
の実行でCtrl-Cを押すと、同じ操作が行われます。 findコマンドで使用する場合と使用しない場合は、同じように機能しますsudo
。 Ctrl-Cをsudoで捕まえないようにするためにそこに入れました。
最初の検索の実行中にそれを実行してCtrl-Cを押すと、次のような状況が発生します。
$ ./trap.sh
first program
^CTrap: CTRL+C received, exit
$