Bash在变量中连接行
我试图将我的zsh提示符转换为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
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
相反),因此嵌入的换行符被简单地视为分隔两个单词的空格,而不是文字换行符