고쳐 쓰다:

고쳐 쓰다:

셸에서 다음 명령을 실행하면 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=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 기반 테스트 장비에서는 그렇습니다.test3sed -u

답변2

다음 명령을 실행해 볼 수 있습니다.

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

또는unbuffer

unbuffer make ...

관련 정보