Dash,命令替换不插入换行符?

Dash,命令替换不插入换行符?

基本上,问题是这样的:

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

我忽略了什么?

答案1

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

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

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

一些关于保留尾随换行符的建议如下:shell:在命令替换中保留尾随换行符('\n')

也可以看看打印包含换行符的变量时,为什么最后一个换行符会被删除?讨论该规范背后的基本原理。

相关内容