This morning, I posted M Tang`s funny experiment in feeding the Unix "yes" command to itself. Now, Seth David Schoen writes in to correct and expand upon the principles therein:
M. Tang`s business about the Unix command
yes `yes no`
is based on a bit of a misconception. The problem is _not_ about
combining one yes command with another yes command. Whenever you use
the backtick syntax `, like in a hypothetical commandfoo `bar`
the shell will first run the command bar (to completion) before it even
tries to start foo. The shell will also save the complete output of bar
in memory, and then present it as a set of command-line arguments to
foo.In this case, the shell is trying to run the command "yes no" to
completion, saving its output in memory, before even starting the other
yes command. Of course, "yes no" never finishes, but it does use up
an arbitrarily large amount of memory.To see that the problem is with the use of `yes` rather than with the
combination of two yes commands, just tryecho `yes no`
or even
true `yes no`
Both of these forms have exactly the same memory-consumption problem as
the original command, and for exactly the same reason! So, Tang is
wrong to think that he is somehow creating a problem by combining
multiple yesses. The problem is in asking the shell to remember an
infinite amount of output.As other people have mentioned in comments, the ` syntax is also not
piping. Piping is done with |, while ` refers to substitution. The
distinction is whether the output of program A appears as input to
program B (piping) or as command-line arguments to program B
(substitution). For example,echo foo bar | wc -w
outputs the number 2 (that`s the total number of words in the text
"foo bar"), whilewc -w `echo foo bar`
counts the number of words in the files foo and bar.