git clone命令写入标准错误(sderr),但为什么不能重定向到标准输出(stdout)?

13
我发现git clone使用STDERR输出。现在我想将其重定向到STDOUT以使用此hack。我遇到了一些问题(同时,我使用了很棒的 stderred库自动将STDERR颜色设置为红色)。您可以在附加的图像中看到问题,这对我来说没有太多意义...请说明原因以及如何使所有输出都转到STDERR,以便我可以正确使用tee

enter image description here


可能是git stderr输出无法进行管道操作的重复问题。 - kenorb
2个回答

14
像许多Unix工具一样,如果将git-clone重定向到管道中,它会更加安静。这种假设是输出对人类有用的,并且只会妨碍程序运行。 tee打破了这个假设,但是git不知道管道末尾是什么。
来自git-clone 手册...
--progress
默认情况下,当标准错误流附加到终端时,进度状态会在标准错误流上报告,除非指定了-q选项。此标志强制报告进度状态,即使标准错误流未指向终端。
您必须指定git clone --progress以强制进行完整输出。

谢谢...我解决了这个问题,但后来我注意到git push也会写入到STDERR,还有wget等等...那么它的目的是什么呢,我不明白...我安装了stderred,现在输出太多都是红色的 :/ - davidhq
@DavidKrmpotic 这些实用程序使用 STDERR 和 STDOUT 来分离人类感兴趣的内容(进展)和程序感兴趣的内容(是否工作,传输了什么...)。它们必须做出一些假设。stderrd 看起来很酷。你可以使用 STDERRED_BLACKLIST 将 git 和 wget 加入黑名单。或者将普通文本变成绿色,享受圣诞主题终端的乐趣! - Schwern
我没有注意到黑名单选项...但无论如何,太麻烦了,我停止使用stderrd了,没有足够的好处,只是在不得不列出很多工具的黑名单时会变得复杂...再次感谢您对主要问题的帮助,真的很有帮助。 - davidhq

1
这是一个将stderr重定向到stdout的工作示例。 我最近的用例是修复Github Actions的一个bug,该bug将所有stderr输出放在日志顶部,而不是与stdout一起按顺序放置。当Microsoft修复此错误时,我需要做很多反向操作... 使用stderr证明git克隆:
$ (git clone --progress https://github.com/sindresorhus/ora.git 2>&1 | tee true) > cmd.stdout 2> cmd.stderr
$ cat cmd.stderr # Nothing here...
$ cat cmd.stdout
Cloning into 'ora'...
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 563 (delta 3), reused 7 (delta 2), pack-reused 551
Receiving objects: 100% (563/563), 652.32 KiB | 2.70 MiB/s, done.
Resolving deltas: 100% (346/346), done.

将 stderr 流转到 stdout:
$ (git clone --progress https://github.com/sindresorhus/ora.git 2>&1 | tee true) > cmd.stdout 2> cmd.stderr
$ cat cmd.stderr # Nothing here now...
$ cat cmd.stdout
Cloning into 'ora'...
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 563 (delta 3), reused 7 (delta 2), pack-reused 551
Receiving objects: 100% (563/563), 652.32 KiB | 2.70 MiB/s, done.
Resolving deltas: 100% (346/346), done.

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