退出git后的输出

时间:2018-02-13 22:16:56

标签: bash git

我运行一个简单的脚本

#!/bin/bash
git fetch --all 2> stderr.txt
echo "Errorcode $?"
cat -n stderr.txt
echo Sleeping
sleep 1
cat -n stderr.txt

奇怪的一点是输出

Fetching origin
Errorcode 1
     1  fatal: Couldn't find remote ref HEAD
     2  error: Could not fetch origin
Sleeping
     1  fatal: Couldn't find remote ref HEAD
     2  error: Could not fetch origin
     3  fatal: The remote end hung up unexpectedly

我如何刷新输出并仍然能够访问错误代码?

我用stdbuf -o0 -e0尝试过,但没有运气。

刷新与tee一起使用,但错误代码丢失 git fetch --all 2>&1 | tee stderr.txt > /dev/null

说明:
- 预计会出现此情况中的错误 - 没有重定向stderr也会出现问题 - 我使用了git version 2.11.0

1 个答案:

答案 0 :(得分:2)

问题在于,在内部,Git已经分离了一个单独的进程来进行提取。这个单独的进程告诉父Git,在单独的进程完成写入stderr之前,获取不能成功,并且父Git会很快退出。

无法修复此问题,而无需修改Git源代码(可以免费使用,因此可以修复它,这不是一件容易的事)。但可以解决这个问题,例如:

if ! git fetch --all 2> stderr.txt; then
    failure=$?
    sleep 0.5 # or however long you think is appropriate
    ... do something with stderr.txt
    ... use the saved failure code in $? ...
else
    # the git fetch worked; $? is 0; no need to sleep
    ...
fi

管道技巧也很有用,但你需要一个像bash的$PIPESTATUS数组这样的功能的shell。请注意,管道技巧有效,因为tee等待管道的所有编写器,并运行:

any-command-here 2>&1 | tee ...

你让你的shell等待tee,它不仅等待命令本身,而且等待生成的可以写入tee的命令。