【问题标题】:Passing arguments to parallel processing in xargs将参数传递给 xargs 中的并行处理
【发布时间】:2017-08-16 17:37:49
【问题描述】:

以下命令中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,等等。第一个命令中的xargs_tasks 设置为$0,通过管道传送到xargs 的参数一次设置为$1。因此,我的第二个命令的工作原理完全相同,因为我在字符串中直接包含 $0 而不是 $1

我的猜测是xargs_tasks 给了你一个短字符串来过滤像htop 这样的东西,但这是一个延伸。

【问题讨论】:

    标签: bash parallel-processing xargs


    【解决方案1】:

    sh使用-c选项时,命令后面的下一个参数在命令中被取为$0,后面的参数变成$1$2等。

    $0 应该包含 shell 脚本的名称,而参数从 $1 开始。所以xargs_task 是否只是一个占位符来防止第一个参数被放入$0

    【讨论】:

    • 所以您认为第一个命令使用xargs_tasks 只是为了遵循bash 脚本中变量命名的标准约定?看起来很合理。
    • 是的。它在命令使用"$@" 之类的所有参数的一般情况下更有用,因为$0 不包含在其中。
    • 我认为不同的 shell 对命令后参数的处理方式也可能存在一些差异。我记得看到有人写 -exec sh -c "command" {} {} 的风格,因为有些 shell 使用第一个参数,有些使用第二个。
    • @shogekiha 接受答案比投票要好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 2021-10-06
    • 2022-10-07
    • 2019-10-05
    • 1970-01-01
    • 2015-06-19
    相关资源
    最近更新 更多