Bash 在xargs中将参数传递给并行处理
以下命令中的Bash 在xargs中将参数传递给并行处理,bash,parallel-processing,xargs,Bash,Parallel Processing,Xargs,以下命令中的xargs_tasks的目的是什么 cat source.ndjson | tr '\n' '\0' | xargs -0 -n 1 -P 8 sh -c './theprocess.py $1' xargs_tasks >> errors.log 2>&1 也就是说,在阅读了-c选项至sh的手册页详细信息后,您实际上可以通过运行以下命令获得相同的结果: cat source.ndjson | tr '\n' '\0' | xargs -0 -n 1 -P
xargs_tasks
的目的是什么
cat source.ndjson | tr '\n' '\0' | xargs -0 -n 1 -P 8 sh -c './theprocess.py $1' xargs_tasks >> errors.log 2>&1
也就是说,在阅读了-c
选项至sh
的手册页详细信息后,您实际上可以通过运行以下命令获得相同的结果:
cat source.ndjson | tr '\n' '\0' | xargs -0 -n 1 -P 8 sh -c './theprocess.py $0' >> errors.log 2>&1
也就是说,对于-c
,引号中字符串后面的任何参数都被分配给变量$0
,$1
,等等<第一个命令中的code>xargs_任务被设置为$0
,通过管道传输到xargs
的参数一次设置为$1
。因此,我的第二个命令的工作原理完全相同,因为我直接在字符串中包含$0
,而不是$1
我的猜测是,
xargs\u tasks
在类似于htop
的内容中为您提供了一个短字符串以进行筛选,但这是一个延伸。当您使用-c
选项进行sh
时,命令后的下一个参数在命令中被视为$0
,而它之后的参数则变为$1
,$2
等
$0
应该包含shell脚本的名称,而参数从$1
开始。因此,xargs_任务
是否只是为了有一个占位符来防止第一个参数被放入$0
,所以您认为第一个命令使用xargs_任务
仅仅是为了遵循bash脚本中变量命名的标准约定?看起来很合理,是的。在一般情况下,如果命令使用诸如“$@”
中的所有参数,那么它更有用,因为$0
不包括在其中。我认为不同的shell在命令后对参数的处理方式上也可能有所不同。我记得看到过一种风格,人们编写-exec sh-c“command”{}{}
,因为有些shell使用第一个参数,有些使用第二个参数。@shogekiha接受答案比向上投票要好。