如何将git命令的输出存储到变量中?

37
我想要的是将git命令(如git status)的输出存储在shell脚本中的变量中。当我说输出时,我指的是在执行命令后终端返回的文本,例如:在我的repo之外执行git status。
fatal: Not a git repository (or any of the parent directories): .git

我尝试了这个:

var=$(git status)

但是 'var' 没有存储任何内容。


1
示例输出可能已经发送到 STDERR,而 var 将包含发送到 STDOUT 的内容。您可以使用 2>&1 将前者重定向到后者。 - Biffen
谢谢,实际上输出到了 STDERR。 - aliasav
2个回答

66

您可以使用:

var=$(git status 2>&1)

即将错误输出重定向到标准输出并捕获输出。

否则,当错误消息被写入stderr时,您的命令:var=$(git status)只会捕获stdout


2
非常感谢!您能提供一些我可以学习的文档链接吗?(我的声望不够高,无法为您点赞。) - aliasav
2
请查看这个关于重定向的不错教程:http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html - anubhava

3

默认情况下,该消息会在标准错误输出,$(cmd) 仅捕获标准输出。您可以通过将标准错误重定向到标准输出来解决此问题 - 参见其他答案之一。但是,您也可以使用退出代码

  • 对于此情况为128
  • 如果没有错误,则为0。

我强烈建议使用退出代码而不是尝试检测字符串“fatal: Not a git repository…”

foo=$(git status)
fatal: Not a git repository (or any of the parent directories): .git
echo $?
128

此外,还有git status --porcelain和--short两个选项,对于脚本编写非常有用。
如果您使用Linux / OS X等操作系统,则可以在git-status手册中查看完整详情。

谢谢,这种使用退出代码的方法正是我需要的。 - aliasav
我该如何检查git命令是否支持退出代码? 因为我正在尝试使用此方法来解决类似的问题。但是命令是git worktree remove。当我将此命令的退出代码存储在shell变量中并打印时,没有任何内容被打印出来-https://stackoverflow.com/q/68409420/5347487 - Darshan L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接