为什么 shell 命令替换会吞掉尾随的换行符?

为什么 shell 命令替换会吞掉尾随的换行符?

按照以下示例,以及我最近的问题 在 bash 中,尾随的换行符去哪里了?,我想知道“为什么”会发生

  x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p 
# Output is: 610a62 
# The trailing newline from the 'echo' command
#   has been "deleted" by Command Substitution

我想一定有一些非常shell 操作(即命令替换)的重要原因是从它所替换的命令输出中实际删除一些数据...
但我无法理解这个问题,因为它似乎是它的对立面应该做..即。将命令的输出传递回脚本进程...保留一个字符对我来说似乎很奇怪,但我认为这是有一个合理的原因...我很想找出这个原因是什么.. 。

答案1

因为 shell 最初并不打算成为一种完整的编程语言。

\n从某些命令输出中删除尾随是相当困难的。然而,出于显示目的,几乎所有命令都以 结束其输出\n,因此......当您想在另一个命令中使用它时,必须有一种简单的方法来删除它。与施工一起自动拆除$()是所选择的解决方案。

所以,也许你会接受这个问题作为答案:

\n如果在以下命令中没有自动完成此操作,您能否找到一种简单的方法来删除尾随?

> echo The current date is "$(date)", have a good day!

请注意,需要加引号以防止破坏格式化日期中可能出现的双空格。

答案2

它是的一部分标准:

shell 应通过执行来扩展命令替换命令在子 shell 环境中(参见Shell执行环境)并替换命令替换(文本命令加上封闭的“$()”或反引号)以及命令的标准输出,删除替换末尾的一个或多个 <newline> 序列。

当然,标准可能是这样编写的,因为这就是ksh它的做法或其他东西,但它是标准,并且是记录的行为。如果您不喜欢它,请使用 Perl 或其他可以让您保留尾随换行符的东西。

答案3

嗯,这对我来说很有意义。换行符仅出现在正常命令输出中的第一个位置,因此在命令完成后会在新行上出现提示。在大多数情况下,换行符不是原始输出的一部分,它的作用是整理屏幕。当您解析命令的输出时,末尾的换行符通常很麻烦。为什么wc命令输出2行文本?哦,不是的,它输出一个后跟一个换行符。当你解析时,wc你不想担心有两行输出这一事实——实际上没有,只有一行。

答案4

为什么echo "hello "(不带引号)会占用空间? IFS 字符的值被 shell 视为分隔符,因此,尾随字符(不分隔任何内容)将被删除。推荐替换只是在子 shell 中简单地执行推荐,因此它遵循相同的逻辑。

相关内容