Bash

在 bash 腳本中使用 Ctrl-C 陷阱終止 ssh

  • May 27, 2020

當我使用第一個腳本按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 INTor 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

引用自:https://unix.stackexchange.com/questions/589081