Если я хочу запустить somecommand > somefile но остановить его, как только somefile достигнет определенного размера, как бы я это сделал?
1 ответ
somecommand | dd bs=1K count=2 iflag=fullblock > somefile
Это записывает в файл ровно 2 КиБ (меньше, если somecommand завершается первой). POSIX не требует iflag=fullblock , ваш dd может не поддерживать его, команда, содержащая iflag=fullblock , не переносима. Сравните этот сценарий, чтобы понять, почему это может быть важно.
После обработки правильного количества блоков (count=2 в приведенном выше примере) dd завершается, это разрывает канал. Это зависит от somecommand как она реагирует на сломанную трубу. Посмотрите на это: что делает процесс Unix умирающим из-за сломанной трубы?
Если количество байтов, которое вы хотите сохранить, вынуждает вас использовать некоторые неудобные bs и / или count , учтите это:
somecommand | { dd bs=1M count=1024 iflag=fullblock; dd bs=10 count=1 iflag=fullblock; } > somefile
Команда запишет 1 ГиБ (= 1024 МБ) плюс 10 байтов.
Некоторые реализации head позволяют вам использовать опцию -c для получения произвольного количества байтов. Это также не переносимо, опция не требуется POSIX.
Согласно этому ответу dd с размером входного блока 1 (ibs=1) является единственным способом POSIX для считывания точного количества байтов.
Если somecommand генерирует текстовый вывод и вы хотите ограничить количество строк в файле, то head - правильный инструмент. Это сохранит только первые 5 строк (опять же, меньше, если somecommand заканчивается первым):
somecommand | head -n 5 > somefile
Опция -n head требуется POSIX.
