Trap
破折號:如何擷取陷阱的輸出(不帶參數呼叫)?
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