Bash在变量中连接行

Bash在变量中连接行,bash,zsh,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 n

我试图将我的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:

在子shell中运行并分配给变量时,bash似乎将这些行连接在一起,我找不到任何解释来说明为什么或如何停止这种操作。

bash
没有连接这些行;相反,在打印之前,您并没有引用扩展名
$gitstatus
。如果你写信

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

相反,引用扩展

echo "$gitstatus"
防止将参数拆分为单词,并将整个字符串(嵌入的换行符和all)作为单个参数传递给
echo


在这种情况下,
bash
zsh
之间的区别在于,
zsh
与POSIX规范不同,它不会对不带引号的参数展开执行分词。

在展开它时,您可能没有引用
$gitstat
。默认情况下,
zsh
不会对不带引号的参数展开执行分词(与按照POSIX规范执行的
bash
相反),因此嵌入的换行符被简单地视为分隔两个单词的空格,而不是文字换行符