在 Bash vs ZSH 中结合 heredoc 和输入重定向

Posted

技术标签:

【中文标题】在 Bash vs ZSH 中结合 heredoc 和输入重定向【英文标题】:Combining heredoc and input redirection in Bash vs ZSH 【发布时间】:2021-09-08 03:04:22 【问题描述】:

以下代码在 ZSH 上运行没有问题,将 heredoc 与文件 test.csv 的内容相结合:

cat <<EOF <test.csv
id,name,age
EOF

如何在 Bash 中编写相同的命令?

【问题讨论】:

【参考方案1】:

$(&lt;file) 可以在 Bash 和 Zsh 中使用:

cat <<EOF
id,name,age
$(<test.csv)
EOF

它也可以在 Ksh 中工作(我相信它是从那里来的,并被移植到 Bash 和 Zsh)。它的行为与$(cat file) 相同,只是它不会调用cat,而是完全由shell 自己处理。

在 Bash 文档Command Substitution 部分中有描述:

命令替换 $(cat file) 可以替换为等效但更快的 $(

【讨论】:

【参考方案2】:

除了@blami's answer,您还可以在一个命令组中使用cat 两次(以在内存中存储所有test.csv 所需的内存换取第二次运行cat 所需的时间)。


  cat <<EOF
  id,name,age
EOF

  cat test.csv

或者,由于这里的文档很短,请使用进程替换(仍然分叉另一个进程):

cat <(echo "id,name,age") test.csv

【讨论】:

我意外地了解到,zsh 允许附加输入重定向(例如,我发现cat &lt;foo.x &lt;bar.xcat &lt;&lt;&lt;uuu &lt;foo.x 都输出了它们所有的输入重定向)。您是否偶然知道,这是在哪里记录的?我查看了手册页的 REDIRECTION 部分,但没有发现提到这一点。 这是你正在谈论的here-string。它在 ZSH 的官方文档中:zsh.sourceforge.io/Doc/Release/Redirection.html。例如,这适用于 ZSH:cat &lt;&lt;&lt;"id,name,age" &lt;test.csv。但是如果问题是关于在 ZSH 下发生的多输入重定向(据说不兼容 posix),我也想知道它。但是,在上面的链接中,您可以读到“如果 word 的替换结果产生了多个文件名,则会依次为每个单独的文件名发生重定向。” zsh 可以与 POSIX 兼容,但默认设置远非如此。有一个选项(MULTIO,默认打开)允许处理多个重定向(而不是仅使用最后一个处理的 POSIX 行为)。我之前不知道单个重定向的多文件名行为。

以上是关于在 Bash vs ZSH 中结合 heredoc 和输入重定向的主要内容,如果未能解决你的问题,请参考以下文章

4PHP EOF(heredoc) 使用说明

Zsh vs. Bash不完全对比解析,zsh是一种更强大的被成为“终极”的Shell

在heredocs中着色,bash

如何在bash脚本中执行存储在heredoc中的curl命令?

如何将 heredoc 写入 Bash 脚本中的文件?

在 Bash 的 heredoc 中将新值推送到数组