[英]Trap execution order in bash
讓我們考慮一下代碼:
#!/bin/bash
trap 'echo EXIT' EXIT
trap 'echo ERR' ERR
false
我如何知道陷阱的執行順序? 很容易理解腳本並檢查它,但我在文檔中找不到任何東西。 你看到什么了嗎?
正如@oguz_ismail 建議的那樣,順序與事件發生的順序相同。
例如,如果您按如下方式管理SIGINT
和EXIT
:
#!/bin/bash
__die() { :;}
__ctrl_c() { :;}
trap __die EXIT
trap __ctrl_c INT
在SIGINT
的情況下(EG Cc
按下或kill -2 "${pid}"
),您將始終在__ctrl_c
之前執行__die
(除非您以其他方式強制執行)。
作為最佳實踐,我通常會重新發送信號:
#!/bin/bash
__ctrl_c() {
printf "%b" "\n" >&2
printf "Interrupted by user ):\n"
# Avoid looping deleting trap
trap 2
# Resend sigint
kill -2 "$$"
}
trap __ctrl_c INT
您可以使用trap -l
(至少來自 bash 5)或kill -l
查看信號列表。
如果您需要一些特定的“模式”來跟隨陷阱,您可以使用kill -signal $$
強制發出信號。
例如,在__ctrl_c
你可以發送kill -15 $$
來調用SIGTERM
您可以閱讀 signal(7) 和 sigaction(2) 了解更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.