関数またはサブシェル内で使用されていない限り、コマンドの終了時にトラップは効果がありません。

関数またはサブシェル内で使用されていない限り、コマンドの終了時にトラップは効果がありません。

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

(または)サブシェルで完全なコマンドを実行します。

(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, ||, &&)

しかし、正しい参照が見つかりません。サブシェルや関数、または同様のものでのみ発生するそうです。

ここで基本的な内容が欠落している場合はお知らせください。

答え1

欠けているのは、sigspecset -eとsigspecの両方がERRコマンドに適用されることです。実装する(ゼロ以外の値で終了するコマンド)ここにb=$((h+))あるもの分析する間違い。コマンドはいいえわからないので実行しました。

関数やサブシェルで動作するのはなぜですか?これは、解析エラーが原因で含まれるスクリプト(関数またはサブシェル)が完全に失敗するためです。つまり、これはb=$((h+))トラップをトリガーせず(サブシェルにトラップが設定されていない)、サブシェルjunkへの呼び出しに失敗します。

関連情報