ここでERRトラップが呼び出されるのはなぜですか?

ここでERRトラップが呼び出されるのはなぜですか?

stderrコマンドの出力に色を割り当てるには、次の機能があります。

red=`tput setaf 1`

colorerr() {
  (trap 'tput sgr0' EXIT; eval "$* 2> >(echo -n \"${red}\"; cat -;)")
}

たとえば、

colorerr "bash -c 'cd ${WEB_APP_DIR}; npm run-script build'"

スクリプトはset -etrap ... ERRおよびを使用して、trap ... EXIT失敗時に行番号とスタックトレースを報告します。渡されたコマンド文字列がcolorerr失敗した場合を除き、すべてがうまく機能し、エラーをキャッチしてより良いレポートを提供したいと思います(関数内でエラーが発生したことを知らせるのは役に立たcolorerrないからです)。

標準|| ...設定を試しましたが、サブシェル内でエラーがcolorerr発生しましたERR trap。テストで以下を試しました。

(trap 'tput sgr0' EXIT; eval "$* 2> >(echo -n \"${red}\"; cat -;)") ||
 true

しかし、ERRトラップは依然としてトリガーされます。|| trueいつものようにエラーコードが「0」に設定されていないのはなぜですか?

答え1

実際には答えではありませんが、解決策です。この試み:

col-err() { "$@" 2> >(grep --color .) ; }

colorerr構文は質問の関数とは若干異なります。 〜のためにcol-err、〜のためにいいえ実行するコマンドを引用すると、次のようになります。

col-err bash -c 'cd ${WEB_APP_DIR}; npm run-script build'

どこでも実行できる例:

col-err bash -c 'ls    $SHELL ${SHELL}_no_such ; echo
                 ls -l $HOME   ${HOME}_no_such | head -2'

col-err呼び出しは変数とgrep一緒に使用されます$GREP_COLORS。色を緑色(ms=01;32下の最初の色)に一度だけ変更します。

GREP_COLORS='ms=01;32:mc=01;33:sl=:cx=:fn=35:ln=32:bn=32:se=36' \
col-err bash -c 'ls    $SHELL ${SHELL}_no_such ; echo
                 ls -l $HOME   ${HOME}_no_such | head -2'

注:カラー文字列は以下で調整されています。クリキス回答「異なるgrepごとに異なる色を使用してください」

関連情報