按照以下示例,以及我最近的问题 在 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
答案3
嗯,这对我来说很有意义。换行符仅出现在正常命令输出中的第一个位置,因此在命令完成后会在新行上出现提示。在大多数情况下,换行符不是原始输出的一部分,它的作用是整理屏幕。当您解析命令的输出时,末尾的换行符通常很麻烦。为什么wc
命令输出2行文本?哦,不是的,它输出一个后跟一个换行符。当你解析时,wc
你不想担心有两行输出这一事实——实际上没有,只有一行。
答案4
为什么echo "hello "
(不带引号)会占用空间? IFS 字符的值被 shell 视为分隔符,因此,尾随字符(不分隔任何内容)将被删除。推荐替换只是在子 shell 中简单地执行推荐,因此它遵循相同的逻辑。