来自高级 Bash 脚本指南:
特殊符号<< ...类似于interactive-program < command-file
事实上,我能想到的与<<
here-document 符号有关的所有事情,我都可以简单地使用< command-file
or来完成<<< 'list of commands'
。也就是说,我可以做
cat < <(echo fdsa
echo asdf)
或者
cat <<< 'fdsa
asdf'
代替
cat << a
fdsa
asdf
a
一个(明显的)例外是,如果您希望命令列表以不同的方式终止,具体取决于您传入的终止参数。但是,我想不出这可能有用的任何情况。
另一个例外是,使用此处文档允许您将特殊字符(例如 ')放入输出中,而不必担心如何转义它们。然而,这似乎也更像是一种便利,而不是一个基本功能。
还有哪里可能here-documents如此重要以至于Unix为它们保留了一个特殊的操作符?
答案1
考虑没有 Bash 的此处字符串 ( <<<"..."
) 或进程替换 ( <(...)
) 的非 Bash shell,以及某些人需要编写在系统之间表现出一定程度的可移植性的脚本这一事实。
每当需要将多行预格式化文本传送到实用程序时,就使用此处文档,可能对其内容执行或不执行变量替换等。
在脚本中,这可能有助于向用户显示一些文本,例如:
为了避免繁琐
echo 'Usage:'
echo " $0 [-a|-b] file [file ...]"
echo
echo 'Options:'
(在书中查看某人实际执行此操作的真实示例,并尝试跟踪哪些字符串被评估,哪些没有被评估。它肯定不会通过我的代码审查:https://books.google.com/books?id=0LvYSCi7QsIC&pg=PA201)
相反,人们可以简单地将此处文档提供给cat
:
cat <<-END_USAGE
Usage:
$0 [-a|-b] file [file ...]
Options:
END_USAGE
END_USAGE
顺便说一句,这还提供了通过智能选择此处文档“标签”( 、等)来对脚本进行一定量文档记录的机会END_FTP
。
ftp
它对于将完整的脚本发送到实用程序(例如能够读取标准输入上的命令序列的其他程序)也很有用。
作为一名 Bash 程序员,您显然可以自由地使用 Bash 的处理方式,但我确实认为,与使用长而杂乱的字符串相比,here-documents 仍然提供了一种将预格式化文档发送到命令的更清晰的方法。
去除来自 Bash 的here-documents 也会使 Bash 作为/bin/sh
大多数 Unix 系统的候选者毫无用处,因为它会严重削弱其 POSIX 一致性。