Bash
在 bash 腳本中使用 Ctrl-C 陷阱終止 ssh
當我使用第一個腳本按
Ctrl
+時,它按預期工作, +沒有任何效果C``Ctrl``C
#!/bin/bash trap '' INT ssh user@server 'svn checkout ...' echo "done"
但是使用第二個腳本
Ctrl
+C
以某種方式終止 SSHconnection 並繼續執行腳本的下一部分#!/bin/bash trap 'echo "message"' INT ssh user@server 'svn checkout ...' echo "done"
我認為在第二個腳本中
Ctrl
+C
應該只將“消息”列印到控制台,而不終止 SSH 連接。為什麼會這樣?是否可以在每次按下Ctrl
+時列印一些消息C
而不終止ssh
?
裡面很
''
特別。trap '' <signame>
它將導致<signame>
被忽略,而不是綁定到虛擬處理程序。信號的“忽略”處置由子程序繼承(例如通過 ssh),但信號處理程序不是。
trap '' INT
不等於trap true INT
ortrap ' ' 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