Если Вы только хотите первую строку или два, следующий тип приема работает и избегает проблем буферизации, заставленных при помощи двух различных команд считать поток вывода:
$ ps -eF | { IFS= read -r x ; echo "$x" ; grep worker; }
$ ls -la / | { IFS= read -r x ; echo "$x" ; grep sbin; }
read
встроено к оболочке и не использует весь буфер входа только для вывода одной строки, таким образом с помощью read
листы вся остальная часть вывода для следующей команды.
Если Вы хотите подчеркнуть проблемы буферизации, показанные Вашими примерами, которые используют две различных команды, добавляют a 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
использует весь буфер вывода только для продолжения его пяти линий каждый раз. Тот использованный буфер не доступен следующему 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
буферизует путем чтения полных 8 КБ (8*1024 байта) вывода канала за один раз, даже для продолжения всего нескольких линий его собственного вывода.
mkfs.vfat -s 64 /dev/scd1
Предположим, вы хотите отформатировать с 64 Сектор на кластер, да, вы можете сделать это с вышеуказанной командой. / dev / scd1 относительно вашего устройства.