Multiline syntax for piping a heredoc; is this portable?
Yes, the POSIX standard allows this. According to the 2008 version:
The here-document shall be treated as a single word that begins after the next
<newline>
and continues until there is a line containing only the delimiter and a<newline>
, with no<blank>
characters in between. Then the next here-document starts, if there is one.
And includes this example of multiple "here-documents" in the same line:
cat <<eof1; cat <<eof2Hi,eof1Helene.eof2
So there is no problem doing redirections or pipes. Your example is similar to something like this:
cat file |cmd
And the shell grammar (further down on the linked page) includes these definitions:
pipe_sequence : command | pipe_sequence '|' linebreak commandnewline_list : NEWLINE | newline_list NEWLINE ;linebreak : newline_list | /* empty */
So a pipe symbol can be followed by an end-of-line and still be considered part of a pipeline.
Yes it's in the POSIX shell grammar. You can also have more than one here-doc for the same command (some other examples use two cat
invocations, but this works as well):
cat <<EOF1 <<EOF2first here-docEOF1second here-docEOF2
This is contrived (using 2 here-docs for stdin), but if you think of providing input for different file descriptors it immediately makes sense.
There's also the possibility to drop the cat
entirely. Why not make the here-document directly available to cmd
:
cmd << EOFinputhereEOF