用xargs输入算术?

时间:2017-10-04 22:51:14

标签: bash xargs

我有一个xargs命令:

xargs -a es_doc_positions.txt -P 64 -I {} populate_es_index.py --start {} --end {}

是否可以接受输入{}并对其应用简单的算术?我想提供类似的结论:

$(({} + 100000 - 1))

到目前为止,我还没有运气。

1 个答案:

答案 0 :(得分:5)

除非你告诉它,否则

xargs不会调用shell。因此,它不能自己执行shell算法。

告诉xargs调用shell,并在该shell中执行算术:

xargs -a es_doc_positions.txt -P 64 -n 16 sh -c '
  for arg do
    ./populate_es_index.py --start "$arg" --end "$(( arg + 100000 - 1 ))"
  done
' _

尾随下划线是$0的占位符,因此xargs传递到shell中的值将分配给$1及更高版本。

-n参数控制每个sh调用运行的实例数。当您接近批输入结束时(当剩余的P * n值仍然少于待处理时),较低的值将导致较少的未使用CPU周期;更高的值将减少启动shell实例时的CPU开销。

请注意,此解决方案不使用-I非常有意。如果你想修改它,你想在_而不是之后将占位符作为最终参数作为代码中的子字符串;使用占位符作为子字符串会引入shell注入漏洞,并且还会阻止单个shell实例处理多个输入。