使用此处文档与此处字符串与多行字符串之间有技术差异吗?

问题描述 投票:0回答:1

这些之间有什么显着差异吗?

cat <<< "one
two
three"

cat << END
one
two
three
END

这让我想知道为什么存在此处文档,以及何时应该使用其中一个文档。即使在

sh
(版本 5.0.18)

中也能正常工作
shell sh
1个回答
0
投票

这里的文档比这里的字符串要古老得多;所以问好像它们是同时发明的并没有多大意义。

简而言之,这里的文档是 1979 年 System V 原始 Bourne shell 的一个功能。 (我推测该功能源自早期的大型批处理语言或受到其启发,但我对它们还不够熟悉,无法进一步探索这一点。)

这里字符串首次在 Plan 9 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
© www.soinside.com 2019 - 2024. All rights reserved.