我运行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 将成为一个损坏的管道,因此如果它打印更多错误,最终可能会被杀死。
要仅获取第一行,同时仍然不破坏git
stderr 管道并保留其退出状态,您可以执行以下操作:
Result=$(
set -o pipefail
git ... 2>&1 > /dev/null | sed '1!d'
)
请注意,打印变量内容的语法是printf '%s\n' "$var
, 而不是。另请参阅echo $var
typeset -p var
类似 Korn 的 shell 来打印其定义。