我试图将我的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中运行并将其分配到一个变量时将这些行连接在一起,我找不到任何解释为什么或如何阻止它。
答案 0 :(得分:1)
bash
没有连接线;相反,在打印它之前,你没有引用$gitstatus
的扩展。如果你写
echo $gitstatus
bash
首先展开$gitstatus
,然后对结果字符串执行分词。任何空格(包括嵌入的换行符)都被视为单词分隔符,以便将字符串拆分为多个单词,每个单词作为单独的参数传递给echo
。 echo
然后在一行上显示每个参数,用一个空格分隔。
相比之下,引用扩展
echo "$gitstatus"
阻止将参数拆分为单词,并将整个字符串(嵌入的换行符和所有字符串)作为单个参数传递给echo
。
在这种情况下,bash
和zsh
之间的区别在于,与POSIX规范相比,zsh
不对未加引号的参数扩展执行分词。