首页 > 解决方案 > 并行:如何从函数中引用多个参数

问题描述

我有这个函数,我需要它来引用使用 GNU 并行函数的多个参数。

foo () {

    cd ${HOME}/sh/xxx/xxx/xxx/folder_with_scripts
    bash -H $1 #replace with echo in test run {echo $1 is being echoed}
    bash -H $2 #replace with echo in test run {echo $2 is being echoed}
}

export -f foo
parallel foo ::: *script.sh bash*.sh

folder_with_scripts 内容

$ ls
firstscript.sh
secondscript.sh
thirdscript.sh
bashhim.sh
bashscript.sh
bashher.sh

parallel foo*script.sh基本上通过将其作为内部参数引用来执行内部的所有脚本foo。这是$1。我想要做的是让它也执行bash*.sh*folders_with_scripts目录内,使用$2.

根据man parallel,语法是:

 parallel [options] [command [arguments]] ( ::: arguments | :::: argfile(s) )

由于::: arguments是复数,我假设这是很有可能的。

结果

为方便起见,我将替换bashecho

$ ./foo.sh
firstscript.sh is being echoed
secondscript.sh is being echoed
thirdscript.sh is being echoed
              is being echoed
              is being echoed
              is being echoed

想要的结果

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

对于我的情况,parallel foo ::: *.sh不会削减它。

交换$1with的位置*script.sh不会削减它

标签: bashshellparallel-processingargumentsgnu-parallel

解决方案


您的问题不包含 MVCE https://stackoverflow.com/help/mcve特别是我无法直接在我的系统上运行您的代码。所以这个答案是基于我对我认为你正在尝试做的事情的最佳猜测。

假设您想bash*.sh为每个运行所有*script.sh

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

如果每个bash*.sh链接到一个*script.sh:::+在版本 20160422 中引入):

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

测试它--dry-run

parallel --dry-run foo ::: *script.sh ::: bash*.sh
parallel --dry-run foo ::: *script.sh :::+ bash*.sh

如果这不能回答您的问题,请使用您希望 GNU Parallel 运行的命令更新问题,例如:

foo firstscript.sh bashhim.sh
foo secondscript.sh thirdscript.sh
foo bashscript.sh bashher.sh

echo *script.sh bash*.sh并在您运行的目录中显示输出parallel

后面的数据:::称为输入源。处理输入源在https://zenodo.org/record/1146014的第 4 章(印刷:http ://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product- 23558902.html )


推荐阅读