Bash在变量中连接行

时间:2014-08-08 01:05:00

标签: bash zsh

我试图将我的zsh提示转换为bash,我有这条线:

local gitstat=$(git status 2>/dev/null | grep '^\(Untracked\|Changes\|Changed but not updated:\)')

在zsh中,当在具有未分级更改和未跟踪文件的Git存储库中时,变量$gitstat设置为

Changes not staged for commit:
Untracked files:

但是在bash中,它被设置为

Changes not staged for commit: Untracked files:

似乎bash在子shell中运行并将其分配到一个变量时将这些行连接在一起,我找不到任何解释为什么或如何阻止它。

1 个答案:

答案 0 :(得分:1)

bash没有连接线;相反,在打印它之前,你没有引用$gitstatus的扩展。如果你写

echo $gitstatus

bash首先展开$gitstatus,然后对结果字符串执行分词。任何空格(包括嵌入的换行符)都被视为单词分隔符,以便将字符串拆分为多个单词,每个单词作为单独的参数传递给echoecho然后在一行上显示每个参数,用一个空格分隔。

相比之下,引用扩展

echo "$gitstatus"

阻止将参数拆分为单词,并将整个字符串(嵌入的换行符和所有字符串)作为单个参数传递给echo

在这种情况下,bashzsh之间的区别在于,与POSIX规范相比,zsh不对未加引号的参数扩展执行分词。