Piping to head results in broken pipe in shell script called from python

后端 未结 2 670
悲哀的现实
悲哀的现实 2021-01-18 23:40

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

相关标签:
2条回答
  • 2021-01-18 23:54

    This answer provides a good summary of the problem with piping from Python to head, and shows some workarounds.

    https://stackoverflow.com/a/30091579/456550

    0 讨论(0)
  • 2021-01-19 00:09

    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.

    0 讨论(0)
提交回复
热议问题