On Tue, Dec 10, 2024 at 05:10:08PM -0500, Chet Ramey wrote:
> On 12/10/24 4:41 AM, Mike Jonkmans wrote:
>
> > Also compare:
> > $ if false; then echo foo; fi
> > $ echo "ret = $?, status = ${PIPESTATUS[*]}"
> > ret = 0, status = 1
> > To:
> > $ if ! :; then echo foo; fi
> > $ echo "ret = $?, status = ${PIPESTATUS[*]}"
> > ret = 0, status = 0
> >
> > The '! :' is a pipeline with status = 1.
> > Yet it is not reflected in PIPESTATUS.
>
> OK, extend that. The `!' applies to the pipeline, not necessarily to all
> the commands in it, since the status of a pipeline is the status of the
> last element (ignore pipefail for now).
I am under the impression that '!' is part of the pipeline.
But re-reading the documentation, see below, explains the behaviour.
> So, given
> ! true | false
Or worse: '! true | ! true' is a syntax error!?
Also errors in dash, but not in ksh.
Can a command - as part of a pipeline - not be a pipeline?
> how should the negation be reflected in the values assigned to PIPESTATUS?
> Since one use of PIPESTATUS is to find out which pipeline element(s)
> succeeded and which failed, how is modifying some element of PIPESTATUS
> here helpful?
The actual behaviour of $? and PIPESTATUS are fine (with me).
What bothers me (only slightly), is the documentation.
Specifically the text on PIPESTATUS:
An array variable (see Arrays below) containing a list of exit
status values from the processes in the most-recently-executed
foreground pipeline (which may contain only a single command).
The 'most-recently-executed' might need some explanation.
Or do you think that it should be clear?
Maybe the manpage is not the right place.
The text 'exit statuses from the *processes* in the ...pipeline',
is (too?) subtle in its use of the word 'processes'.
Processes in a pipeline, can be seen as ruling out the '!' (and 'time')
part of the pipeline.
Maybe rephrase: ... processes (within commands)...
Or maybe not, as it doesn't explain:
if ! case a in esac; then :; fi
Writing (and reading) documentation is not so easy.
--
Regards, Mike Jonkmans