2014-02-21 4 views
2

31 장의 '고급 bash 스크립트'를 읽는 중 문제가 발생했습니다. 나는 그것을 이해할 수 없다.bash 표준 출력을 파일로 리디렉션 할 수 없음

tail -f /var/log/msg | grep 'error' >> logfile

왜 로그 파일로 출력에 아무것도 없다?
설명을 제공 할 수 있습니까? 미리 감사드립니다.

+0

문자열 '오류'가 포함 된/var/log/msg의 끝에는 행이 없기 때문에? 'tail -f'는 파일에 지금 쓰여지고있는 것을 보여주고,'grep'은 일치하는 라인만을 걸러냅니다. 그래서 일치하는 라인이 없다면 아무 것도 출력되지 않을 것입니다. –

+0

@MarkReed, 네, 파일 'msg'에 줄이 있습니다. – ruanhao

+0

@ruanhao : 마지막 10 줄에'error' 텍스트가 있어야합니다. 그렇지 않으면'tail -f'가 새로운 로그가 나타날 때까지 기다립니다. – anubhava

답변

3

@chepner 주석처럼 grep은 stdout을 버퍼링하기 위해 더 큰 버퍼 (아마도 4k 이상)를 사용하고 있습니다. 대부분의 표준 유틸리티는 파이핑이나 파일로 리디렉션 할 때이 작업을 수행합니다. 터미널에 직접 출력 할 때는 일반적으로 회선 버퍼 모드로 전환됩니다.

for ((i=0;;i++)); do echo $i; sleep 0.001; done | grep . | cat 
: 다음 두 명령을 시도 할 수 있습니다,이 효과를 쉽게 관찰 할 수있는 데모로

tail -f /var/log/msg | stdbuf -oL grep 'error' >> logfile 

:

당신은 그 출력의 라인 버퍼링을 할 grep을 강제로 stdbuf utility을 사용할 수 있습니다

for ((i=0;;i++)); do echo $i; sleep 0.001; done | stdbuf -oL grep . | cat 

첫 번째 명령에서, grep . (즉, 모든 줄 일치)를 파이프로 들어가서 cat으로 버퍼링합니다. 광산에서 버퍼는 약 4k 인 것으로 보입니다. 버퍼가 채워지고 플러시 될 때 오름차순 출력이 chunks에 표시됩니다.

두 번째 명령에서 으로 파이프에 출력되는 grep은 라인 버퍼이므로 모든 라인에 대한 터미널 출력, 즉 더 많거나 적은 연속 출력을보아야합니다.

+0

대답 해 주셔서 감사합니다. 그 쪽이 맞는 거 같아요. 트릭을하는 것은'grep'입니다. stdout이 터미널 인 경우에만 버퍼를 사용하지 않습니다. – ruanhao

관련 문제