Bash

如何在 git 命令輸出前添加行

  • February 26, 2020

這是較大腳本的一部分,但我將問題提煉為:

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

我想預先添加 git 輸出,所以它看起來像:

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

但相反,我得到:

一切都是最新的

git 是直接寫到 tty 還是什麼?我不知道發生了什麼事。

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 的控制和重定向操作符?了解更多資訊。

正如您現在已經知道的那樣,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 循環處理文本被認為是不好的做法

引用自:https://unix.stackexchange.com/questions/569908