[12117]bash[115183] не может хранить двоичные данные в своих переменных. Уже достаточно плохо обрабатывать [115184]text[115185] с помощью циклов оболочки, это было бы еще хуже для обработки двоичных данных. Оболочка - это инструмент для выполнения других инструментов.[12118]Также обратите внимание, что команда [115186]read[115187] при входе в оболочку считывает символы, а не байты. [12119] Также, [115188]dd[115189] выполняет [115190] один [12120] системный вызов, поэтому [115194]dd bs=77 счет=1[115195] не обязательно считывает 77 байт, особенно если stdin является трубой (реализация GNU для [115196]dd[115197] имеет для этого [115198] iflag=fullblock[115199]). [12121]Здесь вы хотите использовать язык программирования обработки данных типа [115200]perl[115201]:[12122]В [115202]perl[115203]:[12123]В GNU [115204]awk[115205]:[12124]Если вы хотите использовать оболочку, то лучшим вариантом, вероятно, будет [115206]zsh[115207], которая является единственной, способной хранить двоичные данные в своих переменных: [12125] Если все, что вам нужно сделать, это передать каждый фрагмент в виде stdin для нового вызова [115208] некоторой команды [115209], то вы можете использовать GNU [115210]split[115211] и его [115212]--filter[115213] опцию:[12126]--filter[115215] запускает новую оболочку для оценки [115216]некоторой команды[115217] для каждого фрагмента. Если [115218]sh[115219] не выполнит оптимизацию самостоятельно, можно сделать:[12127]- сохранить вилку.[12128]Используя [115220]dd[115221], можно разобрать его вывод stderr, чтобы узнать конец входного сигнала. Также понадобится специальный GNU [115222]iflag=fullblock[115223]:[12129]Если размер входа кратен 77, то [115224]некоторая команда [115225] будет выполнена дополнительно с пустым входом.[114752].
27.01.2020, 20:29
Ссылка