不按 Ctrl+C 即可停止命令(使用陷阱功能运气不好)

不按 Ctrl+C 即可停止命令(使用陷阱功能运气不好)

我正在尝试制作一个在 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

  1. 定义函数并将陷阱设置在循环之外
  2. 在使用函数之前定义它。

尝试:

#!/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
$ 

相关内容