Why exit code 141 with grep -q?

前端 未结 3 1605
花落未央
花落未央 2020-12-03 00:59

Can someone explain why I get exit code 141 from the below?

#!/usr/bin/bash

set -o pipefail

zfs list | grep tank
echo a ${PIPESTATUS[@]}

zfs list | grep          


        
相关标签:
3条回答
  • 2020-12-03 01:16

    Another option would be to not use a pipe, but use a process substitution:

    grep -q tank <(zfs list)

    Update: I guess is the same thing, as the process run inside parentheses will also receive sigpipe.

    0 讨论(0)
  • 2020-12-03 01:22

    This is because grep -q exits immediately with a zero status as soon as a match is found. The zfs command is still writing to the pipe, but there is no reader (because grep has exited), so it is sent a SIGPIPE signal from the kernel and it exits with a status of 141.

    Another common place where you see this behaviour is with head. e.g.

    $ seq 1 10000 | head -1
    1
    
    $ echo ${PIPESTATUS[@]}
    141 0
    

    In this case, head read the first line and terminated which generated a SIGPIPE signal and seq exited with 141.

    See "The Infamous SIGPIPE Signal" from The Linux Programmer's Guide.

    0 讨论(0)
  • 2020-12-03 01:25

    I'm not familiar with zfs list, but I guess it complains about its standard output being closed - grep -q exits immediately when a match is found, unlike grep.

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