All of lore.kernel.org
 help / color / mirror / Atom feed
* How to inherent non-zero exit status using pipe? (dash)
@ 2010-08-11 12:34 Peng Yu
  2010-08-11 13:51 ` Eric Blake
  0 siblings, 1 reply; 3+ messages in thread
From: Peng Yu @ 2010-08-11 12:34 UTC (permalink / raw)
  To: dash

Hi,

The following example returns the exit status of the last command in a
pipe. I'm wondering if there is a way to inherent non-zero exit status
using pipe. That is, if there is any command in a pipe that return a
non-zero status, I'd like the whole pipe return a non-zero status.

$ cat main.sh
#!/usr/bin/env bash

echo abc 1>&2
echo abc 1>&2
echo abc 1>&2
echo abc 1>&2
echo abc 1>&2
exit 1
$ ./main.sh
abc
abc
abc
abc
abc
$ echo $?
1
$  ./main.sh |head -n 3
abc
abc
abc
abc
abc
$ echo $?
0

-- 
Regards,
Peng

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: How to inherent non-zero exit status using pipe? (dash)
  2010-08-11 12:34 How to inherent non-zero exit status using pipe? (dash) Peng Yu
@ 2010-08-11 13:51 ` Eric Blake
  2010-08-13  1:15   ` Herbert Xu
  0 siblings, 1 reply; 3+ messages in thread
From: Eric Blake @ 2010-08-11 13:51 UTC (permalink / raw)
  To: Peng Yu; +Cc: dash

[-- Attachment #1: Type: text/plain, Size: 1024 bytes --]

On 08/11/2010 06:34 AM, Peng Yu wrote:
> Hi,
> 
> The following example returns the exit status of the last command in a
> pipe. I'm wondering if there is a way to inherent non-zero exit status
> using pipe. That is, if there is any command in a pipe that return a
> non-zero status, I'd like the whole pipe return a non-zero status.

Generally not possible using only POSIX constructs (bash's 'set -o
pipefail' and '${PIPESTATUS[@]}' are extensions).  But what you _can_ do
is play with exec to be able to propagate non-zero status from a
particular portion of a pipeline through a temporary variable or file:

$ exec 3>&1 # duplicate original stdout
$ result=$(
  exec 4>&1 >&3 3>&- # move cmd subst stdout, and restore original
  { ./main.sh; echo $? >&4 # run command, and record its status
  } | head -n 3)
$ echo $? # status from head
$ echo $result # status from ./main.sh
$ exec 3>&-

-- 
Eric Blake   eblake@redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 620 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: How to inherent non-zero exit status using pipe? (dash)
  2010-08-11 13:51 ` Eric Blake
@ 2010-08-13  1:15   ` Herbert Xu
  0 siblings, 0 replies; 3+ messages in thread
From: Herbert Xu @ 2010-08-13  1:15 UTC (permalink / raw)
  To: Eric Blake; +Cc: pengyu.ut, dash

Eric Blake <eblake@redhat.com> wrote:
>
> Generally not possible using only POSIX constructs (bash's 'set -o
> pipefail' and '${PIPESTATUS[@]}' are extensions).  But what you _can_ do
> is play with exec to be able to propagate non-zero status from a
> particular portion of a pipeline through a temporary variable or file:
> 
> $ exec 3>&1 # duplicate original stdout
> $ result=$(
>  exec 4>&1 >&3 3>&- # move cmd subst stdout, and restore original
>  { ./main.sh; echo $? >&4 # run command, and record its status
>  } | head -n 3)
> $ echo $? # status from head
> $ echo $result # status from ./main.sh
> $ exec 3>&-

Another way is to use fifos.

Cheers,
-- 
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2010-08-13  1:15 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-08-11 12:34 How to inherent non-zero exit status using pipe? (dash) Peng Yu
2010-08-11 13:51 ` Eric Blake
2010-08-13  1:15   ` Herbert Xu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.