Shell 向xargs添加额外参数

Shell 向xargs添加额外参数,shell,xargs,Shell,Xargs,我正在尝试启动多个流程来完成一些测试套件。在我的bash脚本中,我有以下内容 printf“%s\0”${SUITE_ARRAY[@]}| xargs-p2-0bash-c'run_test_SUITE”$@“${EXTRA_ARG}” 下面是已定义的脚本,简化为基本脚本 SUITE_数组将是可能有1个或多个{suite1,suite2,…,suiten}的套件列表 EXTRA_ARG类似于在另一个脚本中存储值的特定名称 #!/bin/bash run_test_suite(){ su

我正在尝试启动多个流程来完成一些测试套件。在我的bash脚本中,我有以下内容

printf“%s\0”${SUITE_ARRAY[@]}| xargs-p2-0bash-c'run_test_SUITE”$@“${EXTRA_ARG}”

下面是已定义的脚本,简化为基本脚本

SUITE_数组将是可能有1个或多个{suite1,suite2,…,suiten}的套件列表 EXTRA_ARG类似于在另一个脚本中存储值的特定名称

#!/bin/bash

run_test_suite(){
    suite=$1
    someArg=$2
    someSaveDir=someArg"/"suite
    # some preprocess work happens here, but isn't relevant to running
    runSomeScript.sh suite someSaveDir
}

export -f run_test_suite

SUITES=$1
EXTRA_ARG=$2

IFS=','
SUITECOUNT=0
for csuite in ${SUITES}; do
    SUITE_ARRAY[$SUITECOUNT]=$csuite
    SUITECOUNT=$(($SUITECOUNT+1))
done
unset IFS

printf "%s\0" "${SUITE_ARRAY[@]}" | xargs -P 2 -0 bash -c 'run_test_suite "$@" ${EXTRA_ARG}'
我遇到的问题是如何将
${EXTRA_ARG}
传递到xargs中。从我对它的理解来看,xargs会接受任何管道中输入的内容,所以我的方式似乎不正确


有没有关于如何正确传递值的建议?提前感谢

这是一个猜测:

#!/bin/bash

run_test_suite(){
    suite="$1"
    someArg="$2"
    someSaveDir="${someArg}/${suite}"
    # some preprocess work happens here, but isn't relevant to running
    runSomeScript.sh "${suite}" "${someSaveDir}"
}

export -f run_test_suite

SUITE_ARRAY="$1"
EXTRA_ARG="$2"

printf "%s\0" "${SUITE_ARRAY[@]}" | 
xargs -n 1 -I '{}' -P 2 -0 bash -c 'run_test_suite {} '"${EXTRA_ARG}"

如果希望子shell可以使用
EXTRA_ARG
,则需要
导出它。您可以使用
export
关键字显式地执行此操作,或者将
var=value
赋值放在与
xargs
本身相同的简单命令中:

#!/bin/bash

run_test_suite(){
    suite=$1
    someArg=$2
    someSaveDir=someArg"/"suite
    # some preprocess work happens here, but isn't relevant to running
    runSomeScript.sh suite someSaveDir
}
export -f run_test_suite

# assuming that the "array" in $1 is comma-separated:
IFS=, read -r -a suite_array <<<"$1"

# see the EXTRA_ARG="$2" just before xargs on the same line; this exports the variable
printf "%s\0" "${suite_array[@]}" | \
  EXTRA_ARG="$2" xargs -P 2 -0 bash -c 'run_test_suite "$@" "${EXTRA_ARG}"' _
#/bin/bash
运行测试套件(){
套房=1美元
someArg=$2
someSaveDir=someArg“/”套件
#一些预处理工作在这里进行,但与运行无关
runSomeScript.sh套件someSaveDir
}
导出-f运行测试套件
#假设$1中的“数组”以逗号分隔:

IFS=,read-r-a suite_array使用GNU Parallel它看起来像这样:

#!/bin/bash

run_test_suite(){
    suite="$1"
    someArg="$2"
    someSaveDir="$someArg"/"$suite"
    # some preprocess work happens here, but isn't relevant to running                        
    echo runSomeScript.sh "$suite" "$someSaveDir"
}
export -f run_test_suite

EXTRA_ARG="$2"
parallel -d, -q run_test_suite {} "$EXTRA_ARG" ::: "$1"
称为:

mytester 'suite 1,suite  2,suite "three"' 'extra "quoted" args here'
如果阵列中有套件:

parallel -q run_test_suite {} "$EXTRA_ARG" ::: "${SUITE_ARRAY[@]}"

额外的好处:作业的任何输出都不会混合,因此您不必处理

请指定
${SUITE_数组[@]}
中通常有多少个值,以及
${EXTRA_ARG}
是否要使用一次作为
$someArg
${SUITE_数组[@}的重复值
每次运行可能会有所不同;小到2到20+
$someArg
对于每个调用都将保持不变,但是当调用xargs所在的主脚本时,
${EXTRA_ARG}
可能会有所不同。编辑问题并编写一些代码以反映您的评论。我之前的评论中的拼写错误已更正:请指定
${SUITE_ARRAY[@]}
中通常有多少个值,以及
${EXTRA_ARG}
是指一次使用,还是作为
$someArg
导出EXTRA_ARG
的重复值,内部引号关闭外部引号。而
-n1
-I
在这里是不好的做法——这意味着
xargs
为每个项目运行一个新的bash副本,而原始代码没有这样做……通过“关闭外部的”,我的意思是字符串
{}
在这里没有引号。@CharlesDuffy,谢谢,这些不好的引号是一个仓促的打字错误,现在可能已经更正了。。。
-n1
是经过深思熟虑的,是基于代码和对OPs实际意图的猜测。“数组”是逗号分隔的字符串,存储为实际的
bash
数组?嗯,我的代码要求数组只是一个数组,不包含分隔逗号。我知道,对不起。我试图用我认为与手头的问题最相关的部分来说明这一点。再次表示歉意。关于
$1
的作业,你是对的。在我匆忙发布代码的过程中,我遗漏了将
$1
分解成数组的部分,这是一个逗号分隔的参数“suite1,suite2,suite3,…,suiten”。老实说,我不太了解shell,所以我使用for循环。我会再次更新这个问题。这里的代码使用
read-a
是将字符串解析为数组的正确方法。看起来这个方法工作得最好,但是我发现如果我只在数组中传入一个值,
-P
将启动两个进程,使用相同的一个参数。我原以为它只会在1开始。我通过检查数组是否为2或更大来解决这个问题,如果是,让
-P
为2,否则使用1。@EmmanuelF,…哪个版本的xargs?我不能复制它<例如,code>printf“%s\n”12 | xargs-p2-n2 bash-c'echo“$:$*”。
,做了我期望的事情。Charles,我最初是这样设置的
printf“%s\0”${suite\u数组[@]}ARG=“$EXTRA\u ARG xargs-p2-n1-0bash-c”运行测试套件“$@”{ARG“\uu
出于某种原因,当我只通过1个参数时,运行测试套件运行了两次。我运行了上面的代码片段,看到它只运行了一次。我想知道我在那里做错了什么。