これは大きなスクリプトの一部ですが、問題を次のように要約します。
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
私は読書をお勧めしますシェルの制御およびリダイレクト演算子は何ですか?より多くの情報を知りたいです。
答え2
これまで知っているように、git push
s出力はstdoutではなくstderrに送信されます。それ以外の場合、またはwhile IFS= read -r line
削除する特別な理由がない限り、常にシェルを使用して入力行を読み取る必要があります。これは常にシェル変数を引用するのと同じです。必要に応じて削除する必要があり、必要に応じて追加するものではありません。IFS=
-r
FWIW 私は次を使用します:
cm_safe() { git push 2>&1 | awk '{print "cm safe push:", $0}'; }
または:
cm_safe() { git push 2>&1 | sed 's/^/cm safe push: /'; }
とにかくそれを考えるとシェルループを使用してテキストを処理することは悪い習慣と見なされます。。
答え3
これはうまくいくようですが、理由はわかりません。
git push &> /dev/stdout
gitがstdout / stderrをターミナルstdoutに送信するように強制しますか?私は理解できません。