Bash 似乎从子 shell 的输出中删除了尾随换行符。例如:
$ echo "Newline: '$(echo $'\n')'"
将产生输出
Newline: ''
有人知道解决方法或防止这种截断发生的方法吗?
如果您只需要变量中的换行符:
nl=$'\n'
如果您需要保留换行符,您可以这样做(您在自己的答案中显示):
f () { echo "hello"; }
output=$(f; echo "x")
output=${output%x}
echo "'$output'"
结果:
'hello
'
经过更多实验,我找到了使用 shell 变量的解决方法。基本上,我确保输出不以换行符结尾,然后稍后删除添加的文本
output="$(echo $'\n'x )"
output="${output%x}"
echo "Newline: '$output'"
这给出了正确的输出
Newline: '
'
一个简单的单行解决方案(无需变量)
echo "Newline: '$(echo $'\n \b')'"
Newline: '
'
解释
\n
:打印 1 个换行符
:打印 1 个空格\b
:后退 1 个字符(删除空格)\b
不是换行符,因此它不会被截断对我来说的优点是不需要声明变量就能够使用变量替换。
但我不确定这是否适用于所有地方。
有点偏离主题,但可能相关
在此特定情况下,以下内容是等效的:
echo $'\n \b'
echo -e '\n \b'
但是,一般来说,
$'...'
是一种特殊的bash引用功能,而-e
是echo
内置命令的标志,它们的行为并不完全相同。
一个显着的区别是你可以写:
echo $'Someone\'s favorite command'
但是你不能写:
echo -e 'Someone\'s favorite command'
您可以使用
-e
选项来启用反斜杠转义的解释,并通过一个 echo
完成所有操作。
$ echo -e "Newline: '\n'"
将产生输出
Newline: '
'