On 6/4/22 7:12 PM, Rob Landley wrote:

P.S. Currently I'm trying to work out the sequencing of redirects vs
$(subshells) because these work:

$ bash -c $'if true; then cat; fi << EOF\none two\nEOF'
one two
$ bash -c $'[[ $(cat) == "one two" ]] <<EOF\none two\nEOF'
$
$ bash -c $'[[ $(cat) == "one two" ]] <<EOF\none two\nEOF\n[ $? -eq 0 ] && echo 
yes'
yes

But this hangs (cat is reading stdin, not the HERE document):
$ bash -c $'[ $(cat) == "one two" ] <<EOF\none two\nEOF'
^C

It's an order of operations question. One of the things about compound
commands is that the redirections apply to the entire command, so they
are performed before the compound command is executed. So what happens is
the command gets parsed into a tree, like always, then executed, and
redirections happen before the command is executed. For `[[' the operand
expansion is part of the execution, so the redirection has already taken
place.

Now, `[' is a simple command, not a compound command. Bash performs the
word expansions before performing redirections. It always has, and it
makes things like handling null commands with redirections slightly
easier. It's not strictly Posix-conformant.

(And having the redirections precede the simple command on the input line
only affects the parser -- it ends up getting parsed to the same structure
and executed the same way as putting them after the command.)

Chet
--
``The lyf so short, the craft so long to lerne.'' - Chaucer
                 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRU    c...@case.edu    http://tiswww.cwru.edu/~chet/
_______________________________________________
Toybox mailing list
Toybox@lists.landley.net
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to