当我在第一个脚本中按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 '' INT
trap 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