如何在 git 命令输出前面添加行

如何在 git 命令输出前面添加行

这是一个更大脚本的一部分,但我将问题归结为:

cm_safe(){
   git push | while read line; do
    echo "cm safe push: $line"
   done;
}

我想在 git 输出前面添加,所以它看起来像:

cm安全推送:一切都是最新的

但我只是得到:

一切都是最新的

git 是直接写入 tty 还是其他东西?我不知道发生了什么事。

答案1

git push写入 stderr,因此您必须将其重定向到 stdout 才能通过管道发送:

cm_safe(){
   git push 2>&1 | while IFS= read -r line; do
     echo "cm safe push: $line"
   done
}

或者你可以这样做:

git push |& while IFS= read -r line; do

我推荐阅读shell 的控制和重定向运算符是什么?了解更多信息。

答案2

正如您现在已经知道的,git pushs 输出将发送到 stderr,而不是 stdout。除此之外,您应该始终使用while IFS= read -r lineshell 来读取输入行,除非您有非常具体的原因要删除IFS=-r.这就像总是引用你的 shell 变量 - 这是你在必要时删除的东西,而不是你在必要时添加的东西。

FWIW我会使用:

cm_safe() { git push 2>&1 | awk '{print "cm safe push:", $0}'; }

或者:

cm_safe() { git push 2>&1 | sed 's/^/cm safe push: /'; }

无论如何,尽管考虑到这一点使用 shell 循环处理文本被认为是不好的做法

答案3

这似乎有效,但我不知道为什么:

 git push &> /dev/stdout

它是否强制 git 将其 stdout/stderr 发送到终端 stdout?我不明白

相关内容