为什么 bash 在命令替换/函数分配中去除新行?

为什么 bash 在命令替换/函数分配中去除新行?

假设我们有这样的代码:

a=$(echo -e "a\n\n\n")
echo "_${a}_"

输出是:_a_,这让我有点惊讶。有什么想法为什么会发生这种情况吗?

答案1

因为 bash 所基于的 bourne shell 从 40 年前就开始这样做(通过语法从反引号到 , 的变化而延续下来$(...),并且也是标准所要求的)。

所有其他类似的 shell 也是如此,包括但不限于 zsh、ksh、yash 等。

也没有明确的理由(只有事后合理化)。但它可以很容易地解决:

a=$(some_command; echo x); a=${a%x}

反引号在 csh 中的工作方式不同,其中输出在空格上分割为多个单词(或在内部时与空格混合的换行符"..."),并且任何尾随换行符将变成单个空格:

printf 'a\n\n\n' > file
csh -c 'echo `cat file`b'
a b

其他也具有反引号/命令替换的编程语言(例如 perl 或 php)没有任何这些怪癖,并且正在捕获命令的确切输出:

perl -e 'print qx(printf "a\n\n")."b\n"'
a

b

相关内容