OK, but I don't see the redirect to descriptor 4 in the real code (it's obviously there in the example).
:: psi On Oct 1, 2013, at 3:58 PM, Duffie Cooley <dcoo...@nicira.com> wrote: > From the reference. > > Lets examine that step by step. > > ( ( ( ( someprog; #part6 > echo $? >&3 #part5 > ) | filter >&4 #part4 > ) 3>&1 #part3 > ) | stdintoexitstatus #part2 > ) 4>&1 #part1 > From bottom up: > > A subshell is created with file descriptor 4 redirected to stdout. This means > that whatever is printed to file descriptor 4 in the subshell will end up as > the stdout of the entire construct. > A pipe is created and the commands on the left (#part3) and right > (stdintoexitstatus) are executed. stdintoexitstatus is also the last command > of the pipe and that means the exit status of stdintoexitstatus will be the > exit status of the entire construct. > A subshell is created with file descriptor 3 redirected to stdout. This means > that whatever is printed to file descriptor 3 in this subshell will end up in > stdintoexitstatus and in turn will be the exit status of the entire construct. > A pipe is created and the commands on the left (#part5 and #part6) and right > (filter >&4) are executed. The output of filter is redirected to file > descriptor 4. In #part1 the file descriptor 4 was redirected to stdout. This > means that the output of filter is the stdout of the entire construct. > Exit status from #part6 is printed to file descriptor 3. In #part3 file > descriptor 3 was redirected tostdintoexitstatus. This means that the exit > status from #part6 will be the final exit status for the entire construct. > someprog is executed. The exit status is taken in #part5. The stdout is taken > by the pipe in#part4 and forwarded to filter. The output from filter will in > turn reach stdout as explained in#part4 > > > On 10/01/2013 03:34 PM, Paul Ingram wrote: >> Why the redirect from descriptor 4? >> >> :: psi >> >> On Oct 1, 2013, at 3:13 PM, Duffie Cooley <dcoo...@nicira.com> wrote: >> >>> What about this? >>> >>> referenced from here. >>> >>> http://unix.stackexchange.com/questions/14270/get-exit-status-of-process-thats-piped-to-another/70675#70675 >>> >>> diff --git a/utilities/ovs-lib.in b/utilities/ovs-lib.in >>> index 1684ddc..5286e12 100644 >>> --- a/utilities/ovs-lib.in >>> +++ b/utilities/ovs-lib.in >>> @@ -41,6 +41,11 @@ ovs_ctl_log () { >>> echo "$@" >> "${logdir}/ovs-ctl.log" >>> } >>> >>> +stdintoexitstatus () { >>> + read exitstatus >>> + return $exitstatus >>> +} >>> + >>> ovs_ctl () { >>> case "$@" in >>> *"=strace"*) >>> @@ -51,7 +56,7 @@ ovs_ctl () { >>> ;; >>> *) >>> echo "`date -u`:$@" >> "${logdir}/ovs-ctl.log" >>> - "${datadir}/scripts/ovs-ctl" "$@" 2>&1 | tee -a >>> "${logdir}/ovs-ctl.log" >>> + (((("${datadir}/scripts/ovs-ctl" "$@" 2>&1 ; echo $? > &3) >>> | tee -a "${logdir}/ovs-ctl.log" ) 3>&1) | stdintoexitstatus) 4>&1 >>> ;; >>> esac >>> } >>> >>> >>> Thanks, >>> >>> Duffie >>> >>> >>> On 10/01/2013 11:48 AM, Gurucharan Shetty wrote: >>>> This patch works for me, but it is a little hacky. >>>> >>>> diff --git a/utilities/ovs-lib.in b/utilities/ovs-lib.in >>>> index 1684ddc..b0cdaf2 100644 >>>> --- a/utilities/ovs-lib.in >>>> +++ b/utilities/ovs-lib.in >>>> @@ -51,7 +51,13 @@ ovs_ctl () { >>>> ;; >>>> *) >>>> echo "`date -u`:$@" >> "${logdir}/ovs-ctl.log" >>>> - "${datadir}/scripts/ovs-ctl" "$@" 2>&1 | tee -a >>>> "${logdir}/ovs-ctl.log" >>>> + unique=`(uuidgen) 2>/dev/null` || unique=`date +"%Y %b %d %T"` >>>> + mkfifo "/tmp/${unique}" >>>> + tee -a "${logdir}/ovs-ctl.log" < "/tmp/${unique}" & >>>> + "${datadir}/scripts/ovs-ctl" "$@" > "/tmp/${unique}" 2>&1 >>>> + rc=$? >>>> + rm "/tmp/${unique}" >>>> + return $rc >>>> ;; >>>> esac >>>> } >>>> >>>> On Tue, Oct 1, 2013 at 10:11 AM, Gurucharan Shetty <shet...@nicira.com> >>>> wrote: >>>>> On Mon, Sep 30, 2013 at 7:27 PM, Duffie Cooley <dcoo...@nicira.com> wrote: >>>>>> From: Duffie Cooley <dcoo...@nicira.com> >>>>>> This is a fix for a request to make sure that the openvswitch status >>>>>> command >>>>>> in rhel based distros gives a useful exit status. That was fixed in >>>>>> >>>>>> commit 5e0c05bc058c78a11be6747f62e6ad88e5d06b70 >>>>>> debian: Fix exit status of openvswitch-switch init script "status" >>>>>> command >>>>>> >>>>>> >>>>>> >>>>>> Signed-off-by: Duffie Cooley <dcoo...@nicira.com> >>>>>> --- >>>>>> rhel/etc_init.d_openvswitch | 3 ++- >>>>>> 1 file changed, 2 insertions(+), 1 deletion(-) >>>>>> >>>>>> diff --git a/rhel/etc_init.d_openvswitch b/rhel/etc_init.d_openvswitch >>>>>> index 7e64132..6a53cef 100755 >>>>>> --- a/rhel/etc_init.d_openvswitch >>>>>> +++ b/rhel/etc_init.d_openvswitch >>>>>> @@ -5,7 +5,7 @@ >>>>>> # chkconfig: 2345 09 91 >>>>>> # description: Manage Open vSwitch kernel modules and user-space daemons >>>>>> >>>>>> -# Copyright (C) 2009, 2010, 2011 Nicira, Inc. >>>>>> +# Copyright (C) 2009, 2010, 2011, 2013 Nicira, Inc. >>>>>> # >>>>>> # Licensed under the Apache License, Version 2.0 (the "License"); >>>>>> # you may not use this file except in compliance with the License. >>>>>> @@ -81,6 +81,7 @@ case $1 in >>>>>> ;; >>>>>> status) >>>>>> ovs_ctl status >>>>>> + exit $? >>>>>> ;; >>>>>> version) >>>>>> ovs_ctl version >>>>>> -- >>>>>> 1.8.1.2 >>>>>> >>>>> I don't think this helps. The exit status is always 0. I broke this >>>>> with my implementation of 'ovs_ctl' in ovs-lib tee'ing the o/p to >>>>> ovs-ctl.log. tee will return an exit status of success even though the >>>>> previous command returned an exit status of 1. >>>>> >>>>> I can use the PIPESTATUS variable. But I don't think it is POSIX >>>>> compliant. Any other ideas? >>>>> >>> _______________________________________________ >>> dev mailing list >>> dev@openvswitch.org >>> http://openvswitch.org/mailman/listinfo/dev >
_______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev