You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用GNU Parallel让bash函数正确引用多组脚本参数?

解决GNU Parallel调用bash函数时的参数配对问题

你的问题出在对GNU Parallel参数传递方式的理解上。当前parallel foo ::: *script.sh bash*.sh的写法会把*script.sh和bash*.sh展开后的所有6个文件合并成一个单一的参数列表,Parallel会逐个将每个文件作为$1传入foo,而$2始终是空值,这就是为什么你看到后面几个输出只有“is being echoed”的原因。

根据你的期望结果,你需要的是将*script.sh和bash*.sh这两组参数按位置一一配对,分别作为foo的$1和$2传入,每次调用foo处理一对脚本(比如firstscript.sh配bashhim.sh,secondscript.sh配bashscript.sh等)。要实现这个需求,你需要使用Parallel的--xapply选项(或者等价的:::+分隔符)。

修正后的命令

方法1:使用--xapply选项

parallel --xapply foo ::: *script.sh ::: bash*.sh

方法2:使用:::+分隔符

parallel foo ::: *script.sh :::+ bash*.sh

原理说明

这两种写法都会告诉Parallel:将第一组参数(*script.sh展开的3个文件)和第二组参数(bash*.sh展开的3个文件)按位置一一对应,生成3个任务:

  1. foo firstscript.sh bashhim.sh
  2. foo secondscript.sh bashscript.sh
  3. foo thirdscript.sh bashher.sh

这样你的函数里的两个命令(测试时的echo)就会分别处理$1和$2,最终输出的结果正好符合你的预期:

firstscript.sh is being echoed
bashhim.sh is being echoed
secondscript.sh is being echoed
bashscript.sh is being echoed
thirdscript.sh is being echoed
bashher.sh is being echoed

额外说明

如果你原本的需求是让每个文件单独被处理(即每个文件作为$1,函数只执行一次命令),那你需要调整foo函数,去掉对$2的处理,然后使用parallel foo ::: *script.sh bash*.sh即可,但你提到这种方式无法满足需求,所以上面的按位置配对方案才是你需要的。

内容的提问来源于stack exchange,提问作者Caucasian Malaysian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:59:37