是否允许在一行中使用两个 here-documents,就像下面的例子一样?我无法找到文档,也无法使示例按预期工作 - 查看两个 echo 命令的输出。
$ ssh myhost <<HERE_DOCUMENT_1 <<HERE_DOCUMENT_2
> echo test1
> HERE_DOCUMENT_1
> echo test2
> HERE_DOCUMENT_2
Pseudo-terminal will not be allocated because stdin is not a terminal.
test2
我正在尝试让两个 echo 命令都输出,以便我可以尝试此处描述的解决方案:https://unix.stackexchange.com/questions/4770/quoting-in-ssh-host-foo-and-ssh-host-sudo-su-user-c-foo-type-constructs/102840#102840
到目前为止,我发现在同一行上使用两个 here-documents 不会出现错误,但不清楚是否支持这样做。
答案1
可以使用多个 here-documents。但您不能将多个内容重定向到 stdin。例如,尝试这个更简单的命令:
cat </etc/passwd </etc/hostname
它不会读取两个文件。首先,shell 打开/etc/passwd
并将它放在 fd 0 上,替换之前的 fd 0,然后打开/etc/hostname
并放入那在 fd 0 上,替换/etc/passwd
文件描述符而没有机会读取它。
最后的重定向获胜。
如果您使用 zsh 运行该命令,它可能会按您预期的方式工作,当设置了 MULTIOS 选项时,它允许多次重定向到单个文件描述符(当不模拟另一个 shell 时,它默认处于启用状态)。
在您给出的示例中,在 stdin 上放置 2 个 here-documents 确实毫无意义。如果您希望将它们连接成单个输入,只需在脚本中执行此操作即可。您需要做的就是删除第一个 here-document 分隔符和匹配的重定向。我想您一定在考虑实际应用程序的更复杂的用例。
为了记录,这里有一个在单个命令中使用多个 here-documents 的示例:
cat /dev/fd/3 /dev/fd/0 <<STDIN_END 3<<OTHER_END
this is first
STDIN_END
this is second
OTHER_END
它将首先打印第二个内容,因为我将/dev/fd/3
first放在cat
了 的参数中,这与此处文档重定向出现的顺序相反。(如果 位于OTHER_END
之前STDIN_END
,则它不会被识别为此处文档终止符,因为此处文档尚未开始。)
我怀疑您在另一个问题中链接的答案是由 zsh 用户发布的,他没有意识到它在其他 shell 中不起作用。我在那里留下了一条评论。