我正在尝试制作一个在 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 脚本中停止这个命令,所以我使用了 trap 函数,如代码中所示。但是当我执行脚本时,第一个命令正在运行,直到我按 Ctrl+C,然后执行第二个命令 (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,它将打印“陷阱:CTRL+C 已收到,退出”消息并立即退出。在第二个find
运行时按 Ctrl-C,它也会执行相同的操作。无论是否与 find 命令一起使用,它的工作原理都是一样的sudo
- 我只是将其放在那里以确保它不会 sudo 捕获并吃掉 Ctrl-C。
这是当您运行它并在第一个查找运行时按 Ctrl-C 时会发生的情况:
$ ./trap.sh
first program
^CTrap: CTRL+C received, exit
$