From owner-freebsd-bugs@FreeBSD.ORG Tue Apr 17 19:10:06 2012 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 07EC2106566C for ; Tue, 17 Apr 2012 19:10:06 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id E6D898FC19 for ; Tue, 17 Apr 2012 19:10:05 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id q3HJA5iD081612 for ; Tue, 17 Apr 2012 19:10:05 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id q3HJA5nf081611; Tue, 17 Apr 2012 19:10:05 GMT (envelope-from gnats) Date: Tue, 17 Apr 2012 19:10:05 GMT Message-Id: <201204171910.q3HJA5nf081611@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org From: Jilles Tjoelker Cc: Subject: Re: gnu/167009: grep(1): GNU grep -q can exit !0 even if strings found X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Jilles Tjoelker List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 17 Apr 2012 19:10:06 -0000 The following reply was made to PR gnu/167009; it has been noted by GNATS. From: Jilles Tjoelker To: bug-followup@FreeBSD.org, david@catwhisker.org Cc: Subject: Re: gnu/167009: grep(1): GNU grep -q can exit !0 even if strings found Date: Tue, 17 Apr 2012 21:08:12 +0200 FreeBSD PR gnu/167009: > [strings -a /usr/local/bin/bison | grep -qw /usr/local fails] The peculiar thing is the shell, tcsh. What happens is that grep -q terminates early, so that strings receives SIGPIPE when it tries to write further data. Whereas the exit status of a pipeline in sh is always the exit status of the last element so that your command has the expected behaviour, this is different in tcsh. Tcsh looks backwards for a failing command if the last element has exit status 0, and returns the 141 corresponding to SIGPIPE. If you do not use -q, grep reads all of its input and strings will not be hit by SIGPIPE, so the exit status of the pipeline is the exit status of grep. Something similar happens if 'set -o pipefail' is in effect in bash or ksh93. I can't help but be happy that I'm not using tcsh, because tcsh -c 'yes | :' does return 0 (apparently it doesn't look backwards if the last element is a builtin) and tcsh -c 'yes | if (1) true' hangs. Also, the double prompt I see after typing yes | : in an interactive tcsh doesn't really inspire confidence. -- Jilles Tjoelker