假设我们有这样的代码:
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