trap コマンドは pipe と併用すると動作しない

以下のBashスクリプトがあった場合に、パイプで出力全部ログ吐いちゃおう、 っておもったらうまくERRトラップが動かなくなったので、メモ

動くコード

#!/bin/bash

trap "echo Non-zero exit code detected!" ERR

function fail_please() {
  echo "Returning non-zero exit code!"
  return 1
}

fail_please
# 出力結果
Returning non-zero exit code!
Non-zero exit code detected!

動かないコード

#!/bin/bash

trap "echo Non-zero exit code detected!" ERR

function fail_please() {
  echo "Returning non-zero exit code!"
  return 1
}

fail_please |& tee log_file.log
# 出力結果
Returning non-zero exit code!

Bash: Trap ERR does not work when pipe operator is used

The ERR trap fires for “simple commands” a pipeline is not a simple command.

パイプはシンプルなコマンドではないらしい

pipefail オプションつければ正常に動く

#!/bin/bash

trap "echo Non-zero exit code detected!" ERR
# trap "echo Non-zero exit code detected!" 0 1 2 3 15

function fail_please() {
  echo "Returning non-zero exit code!"
  return 1
}

set -o pipefail
fail_please |& tee log_file.log
Returning non-zero exit code!
Non-zero exit code detected!

メモメモ。。。