Trap

破折號:如何擷取陷阱的輸出(不帶參數呼叫)?

  • February 10, 2017

dash 聯機幫助頁trap中的部分說明如下:

不帶任何參數的陷阱會導致它以適合作為外殼輸入的格式將信號列表及其相關操作寫入標準輸出,從而實現相同的擷取結果。

驚人的!我想我找到了一種簡單的方法來恢復以前被我覆蓋的信號處理程序,方法是將trap’s 的輸出作為命令返回給 shell:

trap "echo 'good'" EXIT

# save signal handlers to $traps
traps="$(trap)"

# override EXIT handler
trap "echo 'bad'" EXIT

# reinstate original handlers
eval "$traps"

期望的輸出:good

實際輸出:bad

這是完全合乎邏輯的,因為$traps它是空的,這又與手冊頁一致:

當 shell 派生出一個子 shell 時,它會將擷取的(但不忽略)信號重置為預設操作。

(命令替換$(trap)分叉了一個子shell,所以trap不知道任何信號處理程序。)


一切似乎都按其應有的方式執行。但是如何利用trap的列表功能呢?

您可以重定向到臨時文件:

file=$(mktemp) || exit
{
 rm -f -- "$file"
 trap
 traps=$(cat)
} > "$file" < "$file"

請注意,在這方面dash’strap不是 POSIX,因為POSIX 確實要求

var=$(trap)

被視為一種特殊情況,即陷阱未在子 shell 中重置。

zsh並且mksh也有這個問題。但是zsh,您可以這樣做:

trap | IFS= read -rd '' traps

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