Bash
如何在 git 命令輸出前添加行
這是較大腳本的一部分,但我將問題提煉為:
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 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 循環處理文本被認為是不好的做法。