셸에서 다음 명령을 실행하면 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 ...