如果我在子 shell 中运行命令,我可以将标准输出收集到变量中,例如:
var=$(echo 'hello world')
echo $var
将按预期打印“hello world”。
如果我添加颜色和新行,这也可以:
var=$(echo "Text in \n\e[34mBlue")
echo -e $var
按预期在下一行打印“蓝色文本”,并带有“蓝色”一词。
但是,如果我尝试使用 git 输出,例如
var=$(git status)
echo $var
它丢失了所有换行符和颜色。
如何捕获 git 命令的输出并稍后打印,同时保留 bash 中的格式和颜色?
答案1
默认值为git的color.ui
配置is auto
,仅在输出到 TTY 时使用颜色。您可以在配置中进行更改,以always
使输出带有颜色。
对于您的用例最有用的是允许覆盖配置值-c
的选项git
仅适用于当前命令。您可以使用它来color.ui
设置always
:
var=$(git -c color.ui=always status)
printf '%s\n' "$var"
请注意,在你的第二个例子中
var=$(echo "Text in \n\e[34mBlue")
echo -e $var
它实际上是echo -e
导致颜色出现的行 - 命令替换内部没有解释转义码echo
,反斜杠和其他字符实际上就在那里。这并不是说颜色代码在当时就被存储了,并且在它们产生时就被遗忘了git
——在一种情况下,它们是在最后创建的,而在另一种情况下,它们根本没有创建。
答案2
尝试这个:
var=$(git status)
echo "$var"
这是关于 bash 引用机制的,没有""
引用周围$var
,newline
内部被视为令牌分隔符,就像 一样blank space
。请参阅 bash 手册以获取更多信息