簡體   English   中英

bash中的Trap執行順序

[英]Trap execution order in bash

讓我們考慮一下代碼:

#!/bin/bash

trap 'echo EXIT' EXIT
trap 'echo ERR' ERR

false

我如何知道陷阱的執行順序? 很容易理解腳本並檢查它,但我在文檔中找不到任何東西。 你看到什么了嗎?

正如@oguz_ismail 建議的那樣,順序與事件發生的順序相同。

例如,如果您按如下方式管理SIGINTEXIT

#!/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM