在 bash 脚本中使用 Ctrl-C 陷阱终止 ssh

在 bash 脚本中使用 Ctrl-C 陷阱终止 ssh

当我在第一个脚本中按Ctrl+时,它按我的预期工作, +没有任何效果CCtrlC

#!/bin/bash
trap '' INT
ssh user@server 'svn checkout ...'
echo "done"

但是使用第二个脚本Ctrl+C以某种方式终止 SSH 连接并继续执行脚本的下一部分

#!/bin/bash
trap 'echo "message"' INT
ssh user@server 'svn checkout ...'
echo "done"

我认为在第二个脚本中Ctrl+C应该只将“消息”打印到控制台,而不终止 SSH 连接。为什么会发生这种情况?是否可以在每次按下Ctrl+时打印一些消息而不终止?Cssh

答案1

里面''trap '' <signame>特别。它将<signame>导致被忽略,不绑定到虚拟处理程序。

信号的“忽略”处理由子进程继承(例如通过 ssh),但信号处理程序则不然。

trap '' INTtrap true INT与或不同trap ' ' INT

help trap在 bash 中会告诉你这么多:

如果ARG空字符串每个SIGNAL_SPEC都是被忽略由 shell 及其调用的命令。


很难说出您真正想要做什么,但如果您只想让脚本在按Ctrl-时打印一条消息C,而不ssh终止命令,则可以这样做:

#!/bin/bash
trap 'echo "message"' INT
ssh user@server 'svn checkout ...' &
while :; do
        wait
        s=$?
        case $s in
        130)    ;;
        129|13?) kill -n "$((s - 128))" "$$";;
        *)      exit "$s";;
        esac
done
echo "done"

如果您希望仍然能够通过- ( ) 终止脚本,请更改ssh ... &为。(trap - QUIT; trap '' INT; exec ssh ...) &Ctrl\SIGQUIT

相关内容