Bash
除非在函式或子 shell 中使用,否則命令退出上的陷阱不起作用
我正在
trap
使用範常式式碼對無效命令返回程式碼進行一些試驗#!/bin/bash # Exit on error trap 'echo 'exiting..';exit' ERR set -e h=1 b=$((h+)) # <----- command causing the error echo $? echo $b echo "end"
即使有違規指令,我也無法導致陷阱發生。但是,如果我在子外殼中執行,則相同
function junk() { h=1 b=$((h+)) echo "Exit code:$?" echo $b echo "end" echo "Hello" } junk
(或)在子shell中執行整個指令
(h=1 b=$((h+)) echo "Exit code:$?" echo $b echo "end" echo "Hello" )
能夠擷取命令失敗並
EXIT
擷取陷阱並相應地列印消息。我知道
set -e
-e errexit When set, the shell exits when a simple command in a command list exits non-zero (FALSE). This is not done in situations, where the exit code is already checked (if, while, until, ||, &&)
但我找不到正確的參考,它說只發生在子外殼或函式或類似的東西上。
如果我在這裡遺漏了一些基本的東西,請告訴我。
您缺少的是
set -e
和 sigspecERR
都適用於命令執行(以非零值退出的命令)。您在這裡遇到的b=$((h+))
是解析錯誤。該命令沒有被執行,因為它不被理解。為什麼它在函式或子 shell 中工作?因為這個解析錯誤使包含腳本(無論是函式還是子shell)整體失敗。換句話說,這不是
b=$((h+))
觸發您的陷阱(您的子外殼中沒有設置陷阱),這是對您的子外殼的呼叫失敗junk
。