Date: Wed, 1 Sep 2021 16:38:00 +0300 From: "=?UTF-8?B?T8SfdXo=?= via austin-group-l at The Open Group" <austin-group-l@opengroup.org> 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