基本上,问题是这样的:
$ echo Hello"$(printf '\n')"World
HelloWorld
我忽略了什么?
答案1
这种行为实际上是 POSIX 的一部分命令替换规范:
shell 应通过在子 shell 环境中执行命令来扩展命令替换(参见 Shell 执行环境),并用命令的标准输出替换命令替换(命令的文本加上封闭的“$()”或反引号),删除替换末尾的一个或多个字符序列. 输出结束前的嵌入字符不应被删除;但是,它们可能被视为字段分隔符并在字段拆分期间被消除,具体取决于 IFS 的值和有效的引号。如果输出包含任何空字节,则行为未指定。
因此正常的引用规则"$(...)"
仅保留非尾随换行符。
一些关于保留尾随换行符的建议如下:shell:在命令替换中保留尾随换行符('\n')
也可以看看打印包含换行符的变量时,为什么最后一个换行符会被删除?讨论该规范背后的基本原理。