用于pipe道heredoc的多行语法; 这是便携式?

我熟悉这个语法:

cmd1 << EOF | cmd2 text EOF 

但是刚发现bash允许我写:

 cmd1 << EOF | text EOF cmd2 

(heredoc被用作cmd2的input)。 这似乎是一个非常奇怪的语法。 它是否便携?

是的,POSIX标准允许这样做。 根据2008年版本:

这里的文档应该被当作一个单词,在下一个<newline>之后开始,直到有一行只包含分隔符和一个<newline> ,而且之间没有<blank>字符。 然后下一个文件开始,如果有的话。

并在同一行中包含多个“here-documents”的示例:

 cat <<eof1; cat <<eof2 Hi, eof1 Helene. eof2 

所以做redirect或pipe道没有问题。 你的例子类似于这样的东西:

 cat file | cmd 

shell语法(进一步在链接页面上)包含这些定义:

 pipe_sequence : command | pipe_sequence '|' linebreak command newline_list : NEWLINE | newline_list NEWLINE ; linebreak : newline_list | /* empty */ 

所以一个pipe道符号可以跟在行尾,仍然被认为是pipe道的一部分。

是的,它在POSIX shell语法中。 你也可以在同一个命令中使用多个here-doc (其他一些例子使用两个cat调用,但是也可以):

 cat <<EOF1 <<EOF2 first here-doc EOF1 second here-doc EOF2 

这是人为的(使用2个文件的标准input),但如果你想为不同的文件描述符提供input,这是有道理的。

也有可能完全放弃cat 。 为什么不把这个文件直接提供给cmd

 cmd << EOF input here EOF 

嗯,我想是的,根据在POSIX模式下的testing:

 $ bash --posix $ cat <<EOF | > ahoj > nazdar > EOF > sed 's/a/b/' bhoj nbzdar