回答
編輯:
看來,我誤解了問題。答案很簡單:
handler1() { do_something; }
handler2() { do_something_else; }
handler3() { handler1; handler2; }
trap handler3 SIGNAL1 SIGNAL2 ...
原文:
只要在命令的末尾列出多個信號:
trap function-name SIGNAL1 SIGNAL2 SIGNAL3 ...
您可以採用與特定信號相關聯的功能trap -p
:
trap -p SIGINT
請注意,即使它們由相同的功能處理,它也會分別列出每個信號。
你可以這樣做增加給定一個已知一個額外的信號:
eval "$(trap -p SIGUSR1) SIGUSR2"
這個工程即使有通過同樣的功能正在處理其他附加信號。換句話說,假設一個函數已經處理了三個信號 - 你可以通過引用一個現有的信號再添加兩個信號(其中只有一個在結束引用內部顯示)。
如果你使用Bash> = 3.2,你可以這樣做來提取給定信號的函數。請注意,它不完全健壯,因爲可能會出現其他單引號。
[[ $(trap -p SIGUSR1) =~ trap\ --\ \'([^\047])\'.* ]]
function_name=${BASH_REMATCH[1]}
然後,如果您需要使用函數名稱等,您可以從頭重建陷阱命令。
他要求多陷阱相同的信號,不一樣的陷阱多想出了信號。 – Darron 2010-07-26 20:13:02
@達隆:對不起,我誤解了這個問題。對**實際**問題的答案要簡單得多,而且我已將它添加到頂端。 – 2010-07-26 20:56:15
你仍然只是發射一個陷阱 - 這個陷阱引發了多重功能,達到的效果或多或少都是無可爭辯的。認爲可能有任何爭議的理由的唯一原因是,如果handler1首先安裝,並且它被設計爲退出,那麼handler2將不會被解僱。但仍然只有一個行動被解僱。 (你一直可以在觸發動作中有一個任意複雜的操作序列。) – 2010-07-26 21:35:45
沒有
關於你可以做的是從單一trap
給定信號運行多個命令是最好的,但你不能有一個信號多個併發的陷阱。例如:
$ trap "rm -f /tmp/xyz; exit 1" 2
$ trap
trap -- 'rm -f /tmp/xyz; exit 1' INT
$ trap 2
$ trap
$
第一行設置信號2(SIGINT)的陷阱。第二行打印當前的陷阱 - 您必須從中捕獲標準輸出並解析它以獲取所需的信號。然後,你可以將你的代碼添加到已經存在的代碼中 - 注意到之前的代碼很可能會包含'退出'操作。第三次調用陷阱會清除2/INT上的陷阱。最後一個顯示沒有未完成的陷阱。
您還可以使用trap -p INT
或trap -p 2
打印特定信號的陷阱。
從技術上講,你不能爲同一個信號設置多個陷阱,但你可以添加到現有的陷阱:
- 取現有疏水閥的代碼中使用
trap -p
- 添加您的命令,用分號隔開或換行
- 設置陷阱的#2
在這裏的結果是的確上述一個bash函數:
# note: printf is used instead of echo to avoid backslash
# processing and to properly handle values that begin with a '-'.
log() { printf '%s\n' "$*"; }
error() { log "ERROR: $*" >&2; }
fatal() { error "[email protected]"; exit 1; }
# appends a command to a trap
#
# - 1st arg: code to add
# - remaining args: names of traps to modify
#
trap_add() {
trap_add_cmd=$1; shift || fatal "${FUNCNAME} usage error"
for trap_add_name in "[email protected]"; do
trap -- "$(
# helper fn to get existing trap command from output
# of trap -p
extract_trap_cmd() { printf '%s\n' "$3"; }
# print existing trap command with newline
eval "extract_trap_cmd $(trap -p "${trap_add_name}")"
# print the new trap command
printf '%s\n' "${trap_add_cmd}"
)" "${trap_add_name}" \
|| fatal "unable to add to trap ${trap_add_name}"
done
}
# set the trace attribute for the above function. this is
# required to modify DEBUG or RETURN traps because functions don't
# inherit them unless the trace attribute is set
declare -f -t trap_add
用法示例:
trap_add 'echo "in trap DEBUG"' DEBUG
這更直接地回答了http://stackoverflow.com/q/16115144/754997 – 2015-09-17 03:13:26
這裏的另一種選擇:
on_exit_acc() {
local next="$1"
eval "on_exit() {
local oldcmd='$(echo "$next" | sed -e s/\'/\'\\\\\'\'/g)'
local newcmd=\"\$oldcmd; \$1\"
trap -- \"\$newcmd\" 0
on_exit_acc \"\$newcmd\"
}"
}
on_exit_acc true
用法:
$ on_exit date
$ on_exit 'echo "Goodbye from '\''`uname`'\''!"'
$ exit
exit
Sat Jan 18 18:31:49 PST 2014
Goodbye from 'FreeBSD'!
tap#
我喜歡理查德·漢森的答案,但我不喜歡嵌入式所以備用的功能是:
#===================================================================
# FUNCTION trap_add()
#
# Purpose: appends a command to a trap
#
# - 1st arg: code to add
# - remaining args: names of traps to modify
#
# Example: trap_add 'echo "in trap DEBUG"' DEBUG
#
# See: http://stackoverflow.com/questions/3338030/multiple-bash-traps-for-the-same-signal
#===================================================================
trap_add() {
trap_add_cmd=$1; shift || fatal "${FUNCNAME} usage error"
new_cmd=
for trap_add_name in "[email protected]"; do
# Grab the currently defined trap commands for this trap
existing_cmd=`trap -p "${trap_add_name}" | awk -F"'" '{print $2}'`
# Define default command
[ -z "${existing_cmd}" ] && existing_cmd="echo exiting @ `date`"
# Generate the new command
new_cmd="${existing_cmd};${trap_add_cmd}"
# Assign the test
trap "${new_cmd}" "${trap_add_name}" || \
fatal "unable to add to trap ${trap_add_name}"
done
}
我不喜歡有這些字符串操作它們在最好的時候混亂玩,所以我想出了這樣的事情:
(很明顯,你可以修改它的其它信號)
exit_trap_command=""
function cleanup {
eval "$exit_trap_command"
}
trap cleanup EXIT
function add_exit_trap {
local to_add=$1
if [[ -z "$exit_trap_command" ]]
then
exit_trap_command="$to_add"
else
exit_trap_command="$exit_trap_command; $to_add"
fi
}
- 1. bash的陷阱不會忽視信號
- 2. 在bash中使用一個陷阱處理多個信號
- 3. bash信號陷阱會覆蓋nohup子命令的信號嗎?
- 4. 是否可以在bash中檢測*哪個*陷阱信號?
- 5. 無法陷阱SIGQUIT信號的Unix
- 6. bash trap''vs陷阱函數傳遞信號
- 7. 澄清的bash陷阱
- 8. $?在bash陷阱裏面
- 9. 如何在陷阱代碼中再次設置bash陷阱?
- 10. 從MS Access的空陷阱的陷阱
- 11. 變量擴展的Bash陷阱?
- 12. 從函數退出時的Bash陷阱
- 13. bash中的陷阱語法問題
- 14. 在聲明「陷阱」塊後,Bash信號捕獲未檢測到變量
- 15. 陷阱
- 16. Perl陷阱Ctrl-C(sigint)在bash中
- 17. Bash陷阱,捕獲並將它們作爲相同函數的參數
- 18. 軟件陷阱vs硬件陷阱
- 19. FileSystemWatcher的陷阱
- 20. ReSharper的陷阱
- 21. 程序接收到的信號SIGTRAP,跟蹤/斷點陷阱
- 22. 如何發送和陷阱發送到PID的信號,用C
- 23. 子女後臺進程中的陷阱信號
- 24. snmp陷阱中的變量實例號
- 25. 解析陷阱
- 26. 春季陷阱
- 27. PyThreadState_SetAsyncExc陷阱?
- 28. 擊:陷阱
- 29. Java JIT陷阱
- 30. 形式 - 陷阱
我遇到了類似的問題,並通過[這裏](http://stackoverflow.com/a/16115145/1449569) – 2013-05-22 19:08:50