список анонимных каналов в bash - PullRequest
0 голосов
/ 14 марта 2020

Рассмотрим массив сжатых файлов.

array=(a.jpg.gz b.jpg.gz c.jpg.gz)

Несжатые данные необходимо передать в приложение без использования временных файлов или хлопот именованных каналов.

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

Например, это приложение, естественно, обрабатывает три различных несжатых файла:

convert a.jpg b.jpg c.jpg output.jpg

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

Можно попробовать:

convert $(for a in ${array[@]}; do echo <(gunzip -c < $a); done) output.jpg

Затем появится сообщение, в зависимости от приложения. , аналогично:

/dev/fd/63: No such file or directory

Могут быть рассмотрены некоторые уродливые альтернативы:

$SHELL -c "convert $(for a in ${array[@]}; do echo -n \<\(gunzip -c < $a\)\ ; done) output.jpg"

Доступно ли лучшее решение?

1 Ответ

0 голосов
/ 14 марта 2020

Это примерно то же самое, что и ваша последняя идея создания командной строки для передачи на bash -c. Он использует printf внутренний l oop, а не for l oop. Это, я думаю, устойчиво к любому легальному имени файла, которое может содержать array.

bash -c $'convert $(printf \'<(gunzip -c < %q) \' "$@" ) ' _ "${array[@]}"
...