Nếu bạn chỉ muốn dòng đầu tiên hoặc hai, loại thủ thuật sau hoạt động và tránh các vấn đề về bộ đệm gây ra bằng cách sử dụng hai lệnh khác nhau để đọc luồng đầu ra:
$ ps -eF | { IFS= read -r x ; echo "$x" ; grep worker; }
$ ls -la / | { IFS= read -r x ; echo "$x" ; grep sbin; }
Nó read
được tích hợp vào trình bao và không tiêu thụ toàn bộ bộ đệm đầu vào chỉ để xuất một dòng, do đó, sử dụng read
để lại tất cả phần còn lại của đầu ra cho lệnh sau.
Nếu bạn muốn làm nổi bật các vấn đề về bộ đệm được hiển thị bằng các ví dụ của bạn sử dụng hai lệnh khác nhau, hãy thêm một sleep
để xử lý các vấn đề về thời gian và cho phép lệnh bên trái tạo ra tất cả đầu ra của nó trước khi các lệnh bên phải cố gắng đọc bất kỳ nó:
$ ps -eF | { sleep 5 ; head -n 1 ; grep worker; }
$ ls -la / | { sleep 5 ; head -n 1 ; grep sbin; }
Bây giờ, cả hai ví dụ trên đều thất bại theo cùng một cách - head
đọc toàn bộ bộ đệm của đầu ra chỉ để tạo ra một dòng và bộ đệm đó không có sẵn cho các mục sau grep
.
Bạn có thể thấy vấn đề đệm thậm chí rõ ràng hơn bằng cách sử dụng một số ví dụ đánh số các dòng đầu ra để bạn có thể biết dòng nào bị thiếu:
$ ps -eF | cat -n | { sleep 5 ; head -n 1 ; head ; }
$ ls -la /usr/bin | cat -n | { sleep 5 ; head -n 1 ; head ; }
Một cách đơn giản để xem vấn đề đệm là sử dụng seq
để tạo danh sách các số. Chúng ta có thể dễ dàng biết được những con số bị mất:
$ seq 1 100000 | { sleep 5 ; head -n 1 ; head ; }
1
1861
1862
1863
1864
1865
1866
1867
1868
1869
Giải pháp mẹo của tôi bằng cách sử dụng shell để đọc và lặp lại dòng đầu tiên hoạt động chính xác ngay cả với độ trễ giấc ngủ được thêm vào:
$ seq 1 100000 | { sleep 5 ; IFS= read -r x ; echo "$x" ; head ; }
1
2
3
4
5
6
7
8
9
10
11
Dưới đây là một ví dụ đầy đủ cho thấy các head
vấn đề về bộ đệm, cho thấy mức độ
head
tiêu thụ toàn bộ bộ đệm của đầu ra chỉ để tạo ra năm dòng của nó mỗi lần. Bộ đệm tiêu thụ đó không có sẵn cho head
lệnh tiếp theo
trong chuỗi:
$ 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
Nhìn vào con số 1861
ở trên, chúng ta có thể tính kích thước của bộ đệm đang được sử dụng bằng head
cách đếm seq
đầu ra từ 1
đến
1860
:
$ seq 1 1860 | wc -c
8193
Chúng tôi thấy rằng head
bộ đệm bằng cách đọc toàn bộ 8KB (8 * 1024 byte) của đầu ra đường ống tại một thời điểm, thậm chí chỉ tạo ra một vài dòng đầu ra của chính nó.
head
vàgrep
làm gì ở đó.