如何使用 Ctrl+C 停止整个脚本而不仅仅是当前命令

How to use Ctrl+C to stop whole script not just current command

我有一个脚本如下:

for ((i=0; i < $srccount; i++)); do
    echo -e "\"${src[$i]}\" will be synchronized to \"${dest[$i]}\""
    echo -e $'Press any key to continue or Ctrl+C to exit...\n' 
    read -rs -n1
    rsync ${opt1} ${opt2} ${opt3} ${src[$i]} ${dest[$i]}
done

如果我按 Ctrl+C 响应读取命令,整个脚本将停止,但如果按 Ctrl+Crsync 命令是 运行,只是当前的 rsync 命令将停止,脚本将继续 for循环。

如果用户按下 Ctrl+Crsync 是 [=33],有什么方法可以告诉脚本=],停止 rsync 并退出脚本本身?

Ctrl+C发送中断信号,SIGINT。你需要告诉 bash 在收到这个信号时退出,通过 trap 内置:

trap "exit" INT
for ((i=0; i < $srccount; i++)); do
    echo -e "\"${src[$i]}\" will be synchronized to \"${dest[$i]}\""
    echo -e $'Press any key to continue or Ctrl+C to exit...\n' 
    read -rs -n1
    rsync ${opt1} ${opt2} ${opt3} ${src[$i]} ${dest[$i]}
done

您可以做的不仅仅是收到信号后退出。通常,信号处理程序会删除临时文件。详情请参阅 bash documentation

只需按 Ctrl + Z。它会完全停止你的脚本。