Цикл через двоичные данные разделяет на блоки от stdin в Bash

По моему скромному мнению, лучший способ состоит в том, чтобы создать изображение для виртуальной машины и попросить, чтобы все участники установили виртуальный box/kvm/etc (лучше использовать независимое от платформы решение) на их машине перед семинаром. В этом случае:

  • можно сделать то, что Вы хотите с виртуальной машиной без любого влияния на хост-машину.
  • это работает быстрее, чем LiveCD (но только в случае, если у Вас есть аппаратная поддержка виртуализации),
  • участник может практиковать после того, как семинар закончен
  • нет никакой потребности в CD-ROM (много современных ноутбуков не имеет его),
6
08.03.2014, 19:19
1 ответ
[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].
5
27.01.2020, 20:29

Теги

Похожие вопросы