无法在变量中捕获 git pull 命令的输出

无法在变量中捕获 git pull 命令的输出

我运行git -C /another-directory pull并收到此错误:

您的配置指定与
来自远程的引用“refs/heads/main”合并,但未获取此类引用。

现在我想在变量中获得该响应。

尝试过 read Result < <(git -C /another-directory pull)然后我跑了echo $Result,里面空了。

我也试了git -C /another-directory pull | read Result一下,还是空的。

我能做些什么?

答案1

这是标准错误的输出,而不是标准输出。

要捕获 stdout 和 stderr:

Result=$(git ... 2>&1)

要仅捕获 stderr 而丢弃 stdout:

Result=$(git ... 2>&1 > /dev/null)

仅捕获 stderr 而保留 stdout:

{ Result=$(git ... 2>&1 >&3 3>&-); } 3>&1

read是命令读单词逻辑行(物理行可能使用尾部反斜杠继续)。

要将一行读入变量,你用IFS= read -r line

因此,要读取 的标准错误的第一行git,您可以执行以下操作:

IFS= read -r Result < <(git ... 2>&1 > /dev/null)

但这有几个缺点:

  • 您将失去 的退出状态git。如果read成功,即该命令成功读取一整行,则该命令将成功
  • 由于read将在第一行之后停止读取并退出,git因此 stderr 将成为一个损坏的管道,因此如果它打印更多错误,最终可能会被杀死。

要仅获取第一行,同时仍然不破坏gitstderr 管道并保留其退出状态,您可以执行以下操作:

Result=$(
  set -o pipefail
  git ... 2>&1 > /dev/null | sed '1!d'
)

请注意,打印变量内容的语法是printf '%s\n' "$var, 而不是echo $var。另请参阅typeset -p var类似 Korn 的 shell 来打印其定义。

相关内容