首页 > 解决方案 > bash 中的匿名管道列表

问题描述

考虑一组压缩文件。

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

未压缩的数据需要在不使用临时文件或命名管道的麻烦的情况下传递给应用程序。

如果每个压缩流可以通过简单的连接传递到前一个,那么任务很简单,但是一些应用程序调用需要不同的文件作为不同的参数传递。

例如,此应用程序自然会处理三个不同的未压缩文件:

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

如何使用压缩文件数组捕获等效功能?当然请注意,数组的大小和内容是动态的。

可以尝试:

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"

有更好的解决方案吗?

标签: arraysbashloopsredirectpipe

解决方案


这与您的最后一个想法大致相同,即生成要传递到的命令行bash -c。它利用printf's 的内部循环,而不是使用for循环。我认为,对于array可能包含的任何合法文件名,它都是强大的。

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

推荐阅读