bash - 阻止 git 将非错误写入 stderr

标签 bash git stderr

我有一个脚本,用于自动同步各种远程 git 存储库。我试图用我的脚本做的一件事是从每个命令中捕获 stderr 的输出,并将所有这些错误写入一个文本文件,然后在脚本完成后通过电子邮件发送给我。这将提醒我需要解决的任何问题。不过,我在以下两行中遇到了问题:

{
    git fetch --prune-tags github-fetch master
    git push github master 
} 2> '/tmp/stderr-contents-sync_git_repositories.txt'

问题在于git fetch行正在将以下内容写入 stderr:
From https://github.com/XJDHDR/xjdhdr-random-code.wiki
 * branch            master     -> FETCH_HEAD
   13af304..333d602  master     -> github/master

git pull行是这样写的:
To ssh://github.com/XJDHDR/xjdhdr-random-code.wiki.git
   333d602..da65970  master -> master

我的问题是这些都不是错误,每次运行脚本时都会通过电子邮件发送。我想知道是否有可能阻止 git 将这些非错误写入 stderr 或从 stderr 输出中过滤出这些类型的消息,同时保留真正的错误。

最佳答案

write all those errors into a text file



考虑到大多数 Git 命令在 stderr 上输出信息消息,这些并不总是错误,如 I mentioned here :

stderr as it is just informative messages, not to be consumed by machines.



如果最好测试命令的退出状态并发送电子邮件给 stdout and stderr如果所述退出状态不同于 0

另外,您正在执行两次重定向:>其次是 > :第二个将重新创建 /tmp/stderr-contents-sync_git_repositories.txt :第二个重定向应该是 >> ,不是 > .

所以:
git fetch --prune-tags github-fetch master > tmp 2>&1 || cat tmp > '/tmp/stderr-contents-sync_git_repositories.txt'
git push github master > tmp 2>&1 || cat tmp >> '/tmp/stderr-contents-sync_git_repositories.txt'

在这里,我覆盖了 tmp每个命令上的文件(带有它们的 stdout/stderr),如果该命令失败,我会写入或附加到 /tmp/stderr-contents-sync_git_repositories.txt .

这比您的编辑更容易,您将两个命令重定向到一个文件,即使其中一个可能失败。

这就是为什么我这样做 cmd1 || cat >> file : >>部分仅在 cmd1 时运行失败。

关于bash - 阻止 git 将非错误写入 stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57016157/

相关文章:

用于从 GitHub 下载最新版本的 Bash 脚本

bash - 进程替换捕获stderr

python - Pyramid 记录

bash - 加密/解密存储在配置文件中的密码

Linux expect spawn找不到文件

mysql - Bash init.d 脚本检测到 mysqld 已经启动并正在运行

ios - iOS 应用程序中使用的 API key 和 secret - 将它们存储在哪里?

git - 不要删除 git 提交消息中的空格

git - 在 git 提交范围内搜索文本

java - 第二次调用时 JSch 不提供输出