첫 번째 또는 두 번째 행만 원하는 경우 다음 유형의 트릭이 작동하고 두 개의 다른 명령을 사용하여 출력 스트림을 읽음으로써 발생하는 버퍼링 문제를 피할 수 있습니다.
$ ps -eF | { IFS= read -r x ; echo "$x" ; grep worker; }
$ ls -la / | { IFS= read -r x ; echo "$x" ; grep sbin; }
는 read쉘에 내장되어 있으므로 사용하여 바로 출력 한 줄에 입력의 전체 버퍼를 소비하지 않는 read다음 명령 잎을 출력의 모든 나머지를.
두 개의 다른 명령을 사용하는 예제에 표시된 버퍼링 문제를 강조하려면 sleep타이밍 문제를 제거하고 오른쪽의 명령이 다음 중 하나를 읽으려고 시도하기 전에 왼쪽의 명령이 모든 출력을 생성하도록 허용하십시오. 그것:
$ ps -eF | { sleep 5 ; head -n 1 ; grep worker; }
$ ls -la / | { sleep 5 ; head -n 1 ; grep sbin; }
이제 위의 두 예제 모두 같은 방식으로 실패 head합니다. 출력의 전체 버퍼를 읽고 한 줄만 생성하면 해당 버퍼를 다음에 사용할 수 없습니다 grep.
출력 라인의 번호를 지정하는 몇 가지 예를 사용하여 버퍼링 문제를보다 명확하게 알 수 있으므로 누락 된 라인을 알 수 있습니다.
$ ps -eF | cat -n | { sleep 5 ; head -n 1 ; head ; }
$ ls -la /usr/bin | cat -n | { sleep 5 ; head -n 1 ; head ; }
버퍼링 문제를 보는 간단한 방법 seq은 숫자 목록을 생성하는 것입니다. 어떤 숫자가 빠졌는지 쉽게 알 수 있습니다.
$ seq 1 100000 | { sleep 5 ; head -n 1 ; head ; }
1
1861
1862
1863
1864
1865
1866
1867
1868
1869
쉘을 사용하여 첫 번째 줄을 읽고 에코하는 트릭 솔루션은 수면 지연이 추가 된 경우에도 올바르게 작동합니다.
$ seq 1 100000 | { sleep 5 ; IFS= read -r x ; echo "$x" ; head ; }
1
2
3
4
5
6
7
8
9
10
11
아래는 head버퍼링 문제 를 보여주는 전체 예제 head이며, 매번 5 개의 라인을 생성하기 위해 출력의 전체 버퍼를 소비하는 방법을 보여줍니다
. head순서대로 다음 명령에서 사용 된 버퍼를 사용할 수 없습니다
.
$ seq 1 100000 | { sleep 5 ; head -5 ; head -5 ; head -5 ; head -5 ; }
1
2
3
4
5
1861
1862
1863
1864
499
3500
3501
3502
3503
7
5138
5139
5140
5141
번호를 찾고 1861상기 우리는 버퍼의 크기가 사용되고 계산할 수 head카운트하여 seq출력을 1행
1860:
$ seq 1 1860 | wc -c
8193
우리 head는 파이프 출력의 전체 8KB (8 * 1024 바이트)를 한 번에 읽고 심지어 몇 줄의 자체 출력을 생성하여 버퍼링하는 것을 볼 수 있습니다.
head과grep거기에 아무것도 할 수 없습니다.