我运行一个简单的脚本
#!/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
。
答案 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
的命令。