Как я могу скопировать файл .wav с аудио компакт-диска и проверить его?

Нет гарантии, что оболочка загрузит или не загрузит весь этот документ в память. Огромные сценарии не являются типичными, поэтому разработчики оболочки не особенно склонны оптимизировать их. Даже в некоторой степени нежелательно, чтобы весь скрипт не загружался в память до того, как выполнение начинает его выполнять, но все общие оболочки выполняются до полной загрузки, что означает, что они выполняют мусор, если файл скрипта изменяется во время выполнения.

Экспериментально в Debian jessie, dash, bash, mksh и zsh загружают здесь документ размером 130 КБ в память, тогда как ksh93 копирует фрагменты размером 64 КБ без выделения дополнительной памяти. Таким образом, единственный способ использовать здесь документ, который не помещается в памяти, - это убедиться, что ваш скрипт выполняется с помощью ksh93 (или, возможно, ksh88) - и перед этим убедитесь, что это так и с другими версиями, я не знаю Не проверил, что поведение одинаково для всех сборок ksh.

Что вы можете сделать более переносимым, так это поместить все данные в конец сценария и использовать tail -c $ offset для извлечения полезной нагрузки. На практике это работает, потому что ни одна из обычных оболочек не загружает сценарий полностью в память перед его выполнением.Преимущество этого метода в том, что полезная нагрузка может быть двоичной - здесь документы не могут содержать строку конца heredoc или нулевые байты.

Если ваш скрипт постоянный, вы можете жестко запрограммировать смещение полезной нагрузки. Если это не так, вы можете поместить выделенный маркер в конец сценария и использовать awk для определения его местоположения:

offset=$(awk '{offset += length($0) + 1}
              $0 == "# payload starts here (do not remove this magic comment)" {
                  print offset; exit
              }')
…
tail -c "$offset" <"$0" — …
…
# payload starts here (do not remove this magic comment)

Если у вас более одной полезной нагрузки, вам понадобится более сложная команда для их извлечения. Помните, что head -c существует не во всех вариантах unix. Вы можете использовать dd ibs = 1 count = $ bytes для достижения того же эффекта, но это может быть очень медленным, поскольку многие реализации dd будут копировать по одному байту за раз. Я бы порекомендовал добавить tar-архив и извлекать из него файлы по имени.

1
13.04.2017, 15:22
0 ответов

Теги

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