I have a command I would to run to generate random string:
var=`< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8`
When I run this command i
If one of the parent processes traps sigpipe
, then the pipeline will inherit the ignore
signal disposition, which will cause this problem you're experiencing.
This can be (safely) reproduced with:
( trap '' pipe; var=`< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8 )
Normally, the head -c8
command will be done pretty soon at which point its stdin
is closed. Since it's stdin
is a pipe connected to the stdout
of tr
, it now no longer makes sense for tr
to write to its stdout
. Once it tries to, the system will kill it with SIGPIPE
.
Unless tr
ignores this signal or has inherited the ignore
(SIG_IGN
) disposition for this signal from its parent. Then a write
to tr
's broken stdout
will simply cause a regular error and set errno
to EPIPE
at which point tr
will most likely stringify and outputs this error to its stderr
and exit.