破折号,命令替换不插入换行符?

基本上,这是问题:

$ echo Hello"$(printf '\n')"World HelloWorld 

我忽略了什么?

此行为实际上是命令替换的POSIX 规范的一部分:

shell应通过在子shell环境中执行命令(参见Shell执行环境)并使用命令的标准输出替换命令替换(命令文本加上封闭的“$()”或反引号)来扩展命令替换, 删除替换结束时的一个或多个字符的序列 。 输出结束前的嵌入字符不得删除; 但是,它们可以被视为字段分隔符,并在字段拆分期间被消除,具体取决于IFS的值和有效的引用。 如果输出包含任何空字节,则行为未指定。

因此,正常的引用规则"$(...)"仅保留非尾随换行符。

shell中给出了一些保留尾随换行符的建议:在命令替换中保留尾随换行符(’\ n’)

另请参见打印包含换行符的变量时,为什么最后一个换行符被剥离? 讨论规范背后的基本原理。