修正する:

修正する:

シェルで次のコマンドを実行すると、rsyncファイルの転送中にリアルタイムで出力が表示されます。

rsync --out-format="%n" --info=name1,del2 -rt /foo bar | sed '\@/mmc/@d' | grcat /usr/share/grc/conf.rsync

しかし、同じコマンドがあれば、Makefile出力をバッファリングし、最後にすべてを吐き出すようです。バッファリングされていないことを確認する-uために追加されました。私も違いがある場合に備えて、以下を追加しました。sedsed.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=Nrsync

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ベースのテスト機器ではそうです。test3sed -u

答え2

次のコマンドを実行してみることができます。

stdbuf -i0 -o0 -e make .....

またはunbuffer

unbuffer make ...

関連情報