arrays - 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"
有更好的解决方案吗?
解决方案
这与您的最后一个想法大致相同,即生成要传递到的命令行bash -c
。它利用printf
's 的内部循环,而不是使用for
循环。我认为,对于array
可能包含的任何合法文件名,它都是强大的。
bash -c $'convert $(printf \'<(gunzip -c < %q) \' "$@" ) ' _ "${array[@]}"
推荐阅读
- javascript - 如何将 api 响应值传递给 onclick 函数
- react-native - React Native 0.62.2 外观返回错误的配色方案
- sql - Oracle SQL 时间/日期总是一个字符串?
- python - 在 python csv 中写入具有特定列值的特定行
- flutter - 如何在 Flutter 中将 TextFormField 的错误文本居中?
- spring-boot - 使用有效的 JWT 令牌调用经过 keycloak 身份验证的 API
- docker - Docker 容器以代码 0 退出,没有错误详细信息
- java - 可以将嵌套类用作纯数据集,就像其他语言的“结构”一样?
- r - R:添加列/操作数据框
- c# - 为什么在 IIS 发布时出现程序集加载错误