【问题标题】:Redirect stderr to stdout and stdout to /dev/null when running git command运行 git 命令时将 stderr 重定向到 stdout 并将 stdout 重定向到 /dev/null
【发布时间】:2019-10-11 08:20:51
【问题描述】:

我遇到了一些有趣的事情。正如标题所说,我正在尝试将标准错误重定向到标准输出并抑制/抛出标准输出。 在您将此帖子标记为重复之前Shell: redirect stdout to /dev/null and stderr to stdout,或How to pipe stderr, and not stdout?,或IO Redirection - Swapping stdout and stderr)请给我一个机会。

所以,我想要这样的东西:

#!/bin/bash

temp_func () {
    GLOBALVAR="$($1 "$2" 2>&1 >/dev/null)"
}

temp_func "echo" "hello world"
echo "should be empty: $GLOBALVAR"

temp_func "ecsdfho" "hello world"
echo "should show err: $GLOBALVAR"

如预期的那样,上述工作正常。很酷。

如果我现在改为这样做:

PUSH_RESULT="$(git push "$REMOTE" "$NEW_TAG" 2>&1 >/dev/null)"

$PUSH_RESULT 最终会在发生错误时填充错误(这很棒),但在成功推送时也会包含 git 输出。为什么!?

注意: 我可以通过以下方式绕过这个问题:

PUSH_RESULT="$(git push -q "$REMOTE" "$NEW_TAG" 2>&1)"

但我很好奇为什么初始方法不起作用。

谢谢。

【问题讨论】:

  • 你必须使用2>&1 >/dev/null

标签: linux bash git io


【解决方案1】:

在成功推送后最终包含 git 输出。为什么!?

因为这些消息也会写入 stderr。它不仅针对错误,还针对不被视为最终产品的进度和状态消息。

【讨论】:

  • 谢谢!这是否被认为是不好的做法(例如将 stderr 用于“无错误”消息)?
  • 不,将非错误状态消息写入 stderr 是一种非常好的做法。想象一下,如果你不能做curl http://example.com > file,因为curl 将连接信息和进度条写入与下载文件相同的流中。
猜你喜欢
  • 2014-07-22
  • 2011-05-14
  • 2018-02-25
  • 1970-01-01
  • 2012-01-23
  • 2022-01-18
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多