Date: Wed, 1 Sep 2021 16:38:00 +0300
From: "=?UTF-8?B?T8SfdXo=?= via austin-group-l at The Open Group"
<[email protected]>
Message-ID:
<cah7i3lpfk0tfxwpqny3ma6hzmptsqvsysq5nfzfxetr7yeq...@mail.gmail.com>
| true
| a=$? b=`exit 1` b=$? >`echo /dev/null; exit 2`
| echo $? $a $b
| Now, I wonder, what did I miss?
That $? (the exit status) is defined only when a command completes.
What it is in the middle of a command execution isn't specified.
| Where does it say in the standard that
| the value of parameter `?' is affected by redirections,
It isn't the redirection, but the command substitution that generates
the file name for the redirection.
| and that its
| value depends on assignments that appear earlier in the same command?
All this stuff is just unspecified, the order in which all of this is
carried out, and precisely when $? gets updated, isn't specified, if you
want to achieve meaningful results, you need to split the one multi-assignemnt
with redirect command into multiple commands.
You get 1 0 0 from a shell which only sets $? when a command completes
(and which does the redirect before the arg expansions).
Getting 2 for $? comes because it all depends which of the two command
substitutions is executed first (the last one executed provides $?), which
depends upon whether the redirect happens first or the arg expansions, and
for a command with no actual command word, that's unspecified (implementations
are allowed to do it either way - which the standard allows, as as you see,
different implementations do it different ways, and users need to be aware
of that).
Getting a non-zero value for a or b just means that $? is being internally
updated when a value for it becomes available, rather than only when a
command completes, about which as best I remember, nothing is said in the
standard at all.
kre