尾随换行符从 bash 子 shell 中被截断

问题描述 投票:0回答:4

Bash 似乎从子 shell 的输出中删除了尾随换行符。例如:

$ echo "Newline: '$(echo $'\n')'"

将产生输出

Newline: ''

有人知道解决方法或防止这种截断发生的方法吗?

bash
4个回答
3
投票

如果您只需要变量中的换行符:

nl=$'\n'

如果您需要保留换行符,您可以这样做(您在自己的答案中显示):

f () { echo "hello"; }
output=$(f; echo "x")
output=${output%x}
echo "'$output'"

结果:

'hello
'

1
投票

经过更多实验,我找到了使用 shell 变量的解决方法。基本上,我确保输出以换行符结尾,然后稍后删除添加的文本

output="$(echo $'\n'x )"
output="${output%x}"
echo "Newline: '$output'"

这给出了正确的输出

Newline: '
'

0
投票

一个简单的单行解决方案(无需变量)

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'

-1
投票

您可以使用

-e
选项来启用反斜杠转义的解释,并通过一个
echo
完成所有操作。

$ echo -e "Newline: '\n'"

将产生输出

Newline: '
'
© www.soinside.com 2019 - 2024. All rights reserved.