用于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