这些之间有什么显着差异吗?
cat <<< "one
two
three"
和
cat << END
one
two
three
END
这让我想知道为什么存在此处文档,以及何时应该使用其中一个文档。即使在
sh
(版本 5.0.18) 中也能正常工作
这里的文档比这里的字符串要古老得多;所以问好像它们是同时发明的并没有多大意义。
简而言之,这里的文档是 1979 年 System V 原始 Bourne shell 的一个功能。 (我推测该功能源自早期的大型批处理语言或受到其启发,但我对它们还不够熟悉,无法进一步探索这一点。)
rc
中引入。它于 1989 年首次发布,尽管我不确定这里的字符串是否是原始版本的一个功能。从那里,它们被借用到 ksh
、Bash 和其他现代 shell 中;但它们在 POSIX 中仍然不可用 sh
。
(您在哪个
sh
中发现该功能尚不清楚 - 也许您可以澄清您正在使用哪个操作系统。某些平台只是在“POSIX 模式”下使用 Bash 作为其 sh
实现;这并不会完全禁用许多 Bash 功能,所以也许这就是您发现的。)
主要建议是在任何需要可移植的代码中使用此处的文档。
除此之外,这里的字符串感觉更灵活,尤其是与 Bash 中的“C 风格”字符串表示法结合使用时。
cat <<< $'newline\n\ttab'
另一方面,here 文档具有一些方便的属性,例如允许或禁用此处文档中的变量扩展的能力,以及使用
<<-delimiter
语法去除前导制表符的功能,并在前面添加一个破折号(减号) <<
之后的分隔符。
cat <<-\eof
(Stack Overflow will convert tabs to spaces,
but imagine that this is indented by a tab.)
The backslash, or any quotes
- single or double -
around the delimiter prevents
$variable, `backtick`, and \backslash processing.
eof