On Tue, Dec 10, 2024 at 09:28:31AM +0100, Ulrich Müller wrote:
> >>>>> On Mon, 09 Dec 2024, Mike Jonkmans wrote:
>
> >> Why is `if false; then :; fi' not a pipeline? It is a command, and the
> >> components of a pipeline are commands.
>
> > It is a pipeline indeed, but not the last
> > (doc says: most-recently-executed).
> > The last is the 'false' simple command/pipeline.
>
> Then what about these?
>
> $ true; case a in esac
> $ echo "ret = $?, status = ${PIPESTATUS[*]}"
> ret = 0, status = 0
>
> $ false; case a in esac
> $ echo "ret = $?, status = ${PIPESTATUS[*]}"
> ret = 0, status = 1
>
> "case a in esac" is a one-command pipeline, and certainly it is executed
> after "false". So it should qualify as "the most-recently-executed
> foreground pipeline (which may contain only a single command)".
It is indeed confusing.
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.
I think that 'most-recently-executed pipeline' needs some clarification.
Seemingly a compound command is not considered a pipeline,
when there is no simple command ran.
Moreover, the '!'-part of a pipeline is not influencing PIPESTATUS.
--
Regards, Mike Jonkmans