here-documents(即<<)用于什么?

Ale*_*lex 1 bash here-document

来自高级 Bash 脚本指南

特殊符号 << ... 类似于 Interactive-program < command-file

事实上,我能想到的与<<here-document 符号有关的所有事情,我已经可以简单地使用< command-file或 来完成<<< 'list of commands'。也就是说,我可以做到

cat < <(echo fdsa
echo asdf)
Run Code Online (Sandbox Code Playgroud)

或者

cat <<< 'fdsa
asdf'
Run Code Online (Sandbox Code Playgroud)

代替

cat << a
fdsa
asdf
a
Run Code Online (Sandbox Code Playgroud)

一个(明显的)例外是,如果您希望命令列表以不同的方式终止,这取决于您传入的终止参数。但是,我想不出任何可能有用的情况。

另一个例外是,使用 here-document 允许您将特殊字符(例如 ')放入输出中,而无需担心如何转义它们。然而,这也似乎更像是一种便利而不是基本功能。

这里还有什么地方文档如此重要,以至于 Unix 为它们保留了一个特殊的操作符?

Kus*_*nda 7

考虑没有 Bash 的 here-strings ( <<<"...") 或进程替换 ( <(...)) 的非 Bash shell ,以及一些人需要编写在系统之间表现出一定程度可移植性的脚本这一事实。

每当需要将多行预先格式化的文本片段传送到实用程序时,都可以使用此处文档,可能对其内容执行或不执行变量替换等操作。

在脚本中,这可能有助于向用户显示一些文本,例如:

为了避免繁琐

echo 'Usage:'
echo "    $0 [-a|-b] file [file ...]"
echo
echo 'Options:'
Run Code Online (Sandbox Code Playgroud)

(在书中查看某人实际执行此操作的真实示例,并尝试跟踪评估哪些字符串,哪些未评估。它肯定不会通过我的代码审查:https://books。 google.com/books?id=0LvYSCi7QsIC&pg=PA201

相反,您可以简单地将此处的文档提供给cat

cat <<-END_USAGE
        Usage:
            $0 [-a|-b] file [file ...]

        Options:
END_USAGE
Run Code Online (Sandbox Code Playgroud)

顺便提一句,还提供了一个机会,在这里的文档“标签”的明智选择做了一定量的脚本文件(END_USAGEEND_FTP,等)。

将完整的脚本发送到实用程序(例如ftp或其他能够读取其标准输入上的命令序列的程序)也很有用。

作为 Bash 程序员,您显然可以自由地使用 Bash 的做事方式,但我确实认为 here-documents 仍然提供了一种比使用长而杂乱无章的字符串更清晰的方式将预先格式化的文档发送到命令。

从 Bash 中删除here-document 也会使 Bash 作为/bin/sh大多数 Unix 系统的候选者无用,因为它会严重削弱其 POSIX 一致性。