[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Is there a way to capture all the exit status in an assignment?
From: |
Marco Ippolito |
Subject: |
Re: Is there a way to capture all the exit status in an assignment? |
Date: |
Sun, 26 Apr 2020 18:51:02 +0200 |
The suggestions using temp files with a fixed name feel a bit racy and
brittle if two instances of the script run concurrently.
On Sun, 26 Apr 2020 at 18:06, Koichi Murase <address@hidden> wrote:
> 2020-04-26 23:45 Peng Yu <address@hidden>:
> > I'd like to capture all the exit status in an assignment like the
> > following. It seems that something similar PIPESTATUS should be
> > defined for this to work. Is it possible? Thanks.
>
> I guess you are asking the way to collect the exit statuses without
> rewriting the part `x=$(false)a$(true)b'. I don't think there is a
> way to achieve this without rewriting. And, of course, if it is
> allowed to rewrite that part, you can easily collect the exit statuses.
>
> x1=$(false); STATUS[0]=$?
> x2=$(true); STATUS[1]=$?
> x=${x1}a${x2}b
> declare -p STATUS
>
> Or
>
> { x=$(false;echo $? >&9)a$(true;echo $? >&9); } 9>tmpfile
> mapfile -t STATUS < tmpfile
> declare -p STATUS
>
> Or
>
> mkfifo tmp
> exec 9<> tmp
> rm tmp
> x=$(false;echo $? >&9)a$(true;echo $? >&9)b
> read 'STATUS[1]' <&9
> read 'STATUS[2]' <&9
> declare -p STATUS
>
> Or
>
> # Note: this is a simple implementation so
> # you cannot use ( or ) inside of $()
> function csubstatus {
> local __head= __tail=$1
> local __reg='(\$\([^()]*\))(.*)'
> local __i=0 __result
> while [[ $__tail =~ $__reg ]]; do
> eval "__result[__i]=${BASH_REMATCH[1]}"
> CSUBSTATUS[__i]=$?
> __head=$__head${__tail::${#__tail}-${#BASH_REMATCH}}\${__result[$__i]}
> __tail=${BASH_REMATCH[2]}
> ((__i++))
> done
> eval "$__head$__tail"
> }
> csubstatus 'x=$(false)a$(true)b'
> declare -p CSUBSTATUS
>
> --
> Koichi
>
>