Bash

除非在函式或子 shell 中使用,否則命令退出上的陷阱不起作用

  • December 20, 2018

我正在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

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