如何使用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个任务:
foo firstscript.sh bashhim.shfoo secondscript.sh bashscript.shfoo 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
相关产品推荐
相关产品推荐

