シェルで次のコマンドを実行すると、rsync
ファイルの転送中にリアルタイムで出力が表示されます。
rsync --out-format="%n" --info=name1,del2 -rt /foo bar | sed '\@/mmc/@d' | grcat /usr/share/grc/conf.rsync
しかし、同じコマンドがあれば、Makefile
出力をバッファリングし、最後にすべてを吐き出すようです。バッファリングされていないことを確認する-u
ために追加されました。私も違いがある場合に備えて、以下を追加しました。sed
sed
.ONESHELL:
.ONESHELL:
@rsync --out-format="%n" --info=name1,del2 -rt /foo bar | sed -u '\@/mmc/@d' | grcat /usr/share/grc/conf.rsync
ただし、まだ転送されたファイルをリアルタイムで印刷するrsync
ことはできません。Makefile
原因は何ですか?
修正する:
追加しても何も変わりませ--outbuf=N
んrsync
。
make
私が見るには、私が実行しているコマンドが何でも積極的にバッファリングするように努力しているようですMakefile
。
この動作をどのように停止できますか?
答え1
問題はwithにあるのではなく、すべての機会に(かなり合理的に)バッファリングされているようrsync
です。sed
これは私のテストです。Makefile
rm:
rm -rf /tmp/etc.test
test1: rm
rsync -av --bwlimit=50 /etc/ localhost:/tmp/etc.test | nl -p -ba
test2: rm
rsync -av --bwlimit=50 /etc/ localhost:/tmp/etc.test 2>&1 | sed 's!^!RSYNC> !g' | nl -p -ba
test3: rm
rsync -av --bwlimit=50 /etc/ localhost:/tmp/etc.test 2>&1 | sed -u 's!^!RSYNC> !g' | nl -p -ba
make test1
リアルタイムで情報がわかりました。バッファリングされた出力を取得しますmake test2
。ただし、make test3
出力は交互に表示されます(バッファリングと同じではありませんがtest2
滑らかではありませんtest1
)。経験的な解決策は、sed
(代わりにrsync
)出力がバッファリングされていないと信じるように欺くことです。
stdbuf -oL sed …
延長Makefile
する
test4: rm
rsync -av --bwlimit=50 /etc/ localhost:/tmp/etc.test 2>&1 | stdbuf -oL sed 's!^!RSYNC> !g' | nl -p -ba
テストmake test4
結果はすぐに次のようになります。 (使用)がこのソリューションと異なるtest1
理由は説明できませんが、はい。少なくとも私のPiベースのテスト機器ではそうです。test3
sed -u
答え2
次のコマンドを実行してみることができます。
stdbuf -i0 -o0 -e make .....
またはunbuffer
unbuffer make ...