这是一个更大脚本的一部分,但我将问题归结为:
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 push
s 输出将发送到 stderr,而不是 stdout。除此之外,您应该始终使用while IFS= read -r line
shell 来读取输入行,除非您有非常具体的原因要删除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?我不明白