为什么$(cat)会删除换行符

时间:2016-11-21 10:05:49

标签: bash

foo.sh:

PivotTable

在shell中

#!/bin/bash

x="$(cat)"

echo "got >>>$x<<<"

尾随换行符何处消失?

1 个答案:

答案 0 :(得分:6)

Bash命令替换运算符故意丢弃尾随换行符;这记录在in the manual

  

Bash通过在子shell环境中执行命令并使用命令的标准输出替换命令替换来执行扩展,并删除任何尾随换行符。

这种行为并不特定于Bash,它是由Bourne-descended shell在它之前完成的。原因是方便 - 因为大多数节目&#39;输出以换行符结束,保留它们将需要处理输出的代码以考虑换行符。

由于换行只是从末尾删除,因此可以通过在末尾添加虚拟字符并手动剥离来解决此问题:

# preserve trailing newlines
$ a="$(echo foo; echo .)"; a=${a:0:-1}
$ echo ">>>$a<<<"
>>>foo
<<<

# also works for programs that don't output a newline
$ b="$(printf foo; echo .)"; b=${b:0:-1}
$ echo ">>>$b<<<"
>>>foo<<<

有关更复杂的解决方法,请参阅this answer