在 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】:$(<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 <foo.x <bar.x
和cat <<<uuu <foo.x
都输出了它们所有的输入重定向)。您是否偶然知道,这是在哪里记录的?我查看了手册页的 REDIRECTION 部分,但没有发现提到这一点。
这是你正在谈论的here-string。它在 ZSH 的官方文档中:zsh.sourceforge.io/Doc/Release/Redirection.html。例如,这适用于 ZSH:cat <<<"id,name,age" <test.csv
。但是如果问题是关于在 ZSH 下发生的多输入重定向(据说不兼容 posix),我也想知道它。但是,在上面的链接中,您可以读到“如果 word 的替换结果产生了多个文件名,则会依次为每个单独的文件名发生重定向。”
zsh
可以与 POSIX 兼容,但默认设置远非如此。有一个选项(MULTIO
,默认打开)允许处理多个重定向(而不是仅使用最后一个处理的 POSIX 行为)。我之前不知道单个重定向的多文件名行为。以上是关于在 Bash vs ZSH 中结合 heredoc 和输入重定向的主要内容,如果未能解决你的问题,请参考以下文章
Zsh vs. Bash不完全对比解析,zsh是一种更强大的被成为“终极”的Shell