LINUX.ORG.RU

Обрабатывать stdin в sh кусками

 ,


0

3

В соседнем треде идёт речь о написании генератора торрент-файлов и в связи с этим мне стало любопытно насколько просто будет написать его на шелле. У меня уже есть реализация Bencode на awk, поэтому вопрос только за подсчётом контрольных сумм блоков.

Крупными мазками вырисовывается что-то такое.

cat file1 file2 file3 | ( PIECELENGTH=262144; sz=$PIECELENGTH; while [ $sz = $PIECELENGTH ]; do head -c $PIECELENGTH | tee /tmp/piece.$$ | sha1sum; sz=$(stat -c%s /tmp/piece.$$); done )

Здесь раздражает временный файл и вызов stat. Приглашаю подумать, как обойтись без них. Python/Perl запрещены условием (иначе не интересно).

Здесь раздражает временный файл и вызов stat.

Если в файлах есть нулевой символ, то без временного файла не обойтись. Bash не вычисляет размер файлов, потому без stat - тоже.

vodz ★★★★★
()
Ответ на: комментарий от vodz

без временного файла не обойтись

чой-то? например, dd в stderr выхлопывает «records in/out», можно отследить когда неполный чанк

anonymous
()
Ответ на: комментарий от anonymous

чой-то?

А то, что если без временного файла, то значит либо работать с одним пайпом, либо в переменную, либо в файл. В bash-переменную можно положить что угодно, но прочитать потом удастся только до \0.

vodz ★★★★★
()
Ответ на: комментарий от anonymous

Один и тот же временный файл в конце концов и на любой ФС окажется в памяти-кэше. Если уж речь про непереносимость, то можно и без файла, а с псевдоименнованными пайпами: tee /dev/fd/N

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от anonymous

dd в stderr выхлопывает «records in/out», можно отследить когда неполный чанк

Думал об этом, но анализировать stderr, посылая stdout в пайп, тоже не сахар. В идеале бы что-то с интерфейсом как у xargs (где коллбэк передаётся как параметр), чтобы вот так вызывать:

cat file1 file2 file3 | xstdin -n $PIECELENGTH sha1sum

unterwulf
() автор топика
Ответ на: комментарий от unterwulf

И что же покажает stat для пайпа? ;-)

Если вы не заметили, это был комментарий не к исходной задачи. Но, если хочется извращаться, то действительно можно парсить не stat, а dd of=/dev/null bs=1 :)

vodz ★★★★★
()
Ответ на: комментарий от vodz

либо работать с одним пайпом

и? буферизация построчная, потом просто выцепить из 2>&1 отдельно records и sha1sum

anonymous
()
Ответ на: комментарий от anonymous

откуда инфа? что-то не увидел в sh-портянке

Что вы путаете? Комментарий о «либо работать с одним пайпом» относился к общему решению проблемы: сделать два разных действия с одним stdin разными программами, особенно с теми, которые в принципе не умеют с stdin. То что dd показывает размер - это был ваш конкретный трюк, который не возможно чуть усложнить - он сразу сломается, но если кто и спорит с ним, так это ТСу он не нравится, я тоже подтвердил, что он сработает в качестве извращения.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.