On Solaris 11 OpenIndiana, I observe a test error:
ERROR: tests/misc/env-signal-handler ==================================== --- exp-err1 Sat Feb 29 00:36:58 2020 +++ err1 Sat Feb 29 00:36:58 2020 @@ -1,1 +1,0 @@ -seq: write error: env-signal-handler.sh: set-up failure: ERROR tests/misc/env-signal-handler.sh (exit status: 99) On this platform, the file 'err1t' created through the command (trap '' PIPE; $SHELL -c 'trap - PIPE; seq 999999 2>err1t | head -n1 > out1') sometimes contains the expected message "seq: write error: Broken pipe", sometimes it is empty. Most often it's as expected in the first 3 out of 20 runs: $ for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do (trap '' PIPE; /bin/sh -c 'trap - PIPE; seq 999999 2>err1t | head -n1 > out1') ; echo "Round $i:"; cat err1t; done Round 0: seq: write error: Broken pipe Round 1: seq: write error: Broken pipe Round 2: seq: write error: Broken pipe Round 3: Round 4: Round 5: Round 6: Round 7: Round 8: Round 9: Round 10: Round 11: Round 12: Round 13: Round 14: Round 15: Round 16: Round 17: Round 18: Round 19: Sometimes it's the first 5 out of 20 runs; sometimes the first 3 and the 9th run. So, it looks like a timing issue, as if the 'trap - PIPE' command takes a couple of milliseconds until it becomes effective. If I add a delay, I get mostly the expected output: $ for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do (trap '' PIPE; /bin/sh -c 'trap - PIPE; sleep 1; seq 999999 2>err1t | head -n1 > out1') ; echo "Round $i:"; cat err1t; done Round 0: seq: write error: Broken pipe Round 1: seq: write error: Broken pipe Round 2: seq: write error: Broken pipe Round 3: seq: write error: Broken pipe Round 4: seq: write error: Broken pipe Round 5: Round 6: seq: write error: Broken pipe Round 7: seq: write error: Broken pipe Round 8: seq: write error: Broken pipe Round 9: seq: write error: Broken pipe Round 10: seq: write error: Broken pipe Round 11: seq: write error: Broken pipe Round 12: seq: write error: Broken pipe Round 13: seq: write error: Broken pipe Round 14: seq: write error: Broken pipe Round 15: seq: write error: Broken pipe Round 16: seq: write error: Broken pipe Round 17: seq: write error: Broken pipe Round 18: seq: write error: Broken pipe Round 19: seq: write error: Broken pipe If I use bash instead of /bin/sh, the output is all right: $ for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do (trap '' PIPE; /usr/bin/bash -c 'trap - PIPE; seq 999999 2>err1t | head -n1 > out1') ; echo "Round $i:"; cat err1t; done Round 0: seq: write error: Broken pipe Round 1: seq: write error: Broken pipe Round 2: seq: write error: Broken pipe Round 3: seq: write error: Broken pipe Round 4: seq: write error: Broken pipe Round 5: seq: write error: Broken pipe Round 6: seq: write error: Broken pipe Round 7: seq: write error: Broken pipe Round 8: seq: write error: Broken pipe Round 9: seq: write error: Broken pipe Round 10: seq: write error: Broken pipe Round 11: seq: write error: Broken pipe Round 12: seq: write error: Broken pipe Round 13: seq: write error: Broken pipe Round 14: seq: write error: Broken pipe Round 15: seq: write error: Broken pipe Round 16: seq: write error: Broken pipe Round 17: seq: write error: Broken pipe Round 18: seq: write error: Broken pipe Round 19: seq: write error: Broken pipe But the value of SHELL in config.status is /bin/sh. Apparently /bin/sh is good enough for nearly everything, just not for this 'trap - PIPE' command. I'm not sure what is the best way forward: Use bash here instead of $SHELL whenever it is found in $PATH ? Bruno