Shell 向xargs添加额外参数
我正在尝试启动多个流程来完成一些测试套件。在我的bash脚本中,我有以下内容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
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个参数时,运行测试套件运行了两次。我运行了上面的代码片段,看到它只运行了一次。我想知道我在那里做错了什么。