xargs输入进行算术运算?

num*_*s1x 2 bash xargs

我有一个xargs命令:

xargs -a es_doc_positions.txt -P 64 -I {} populate_es_index.py --start {} --end {}
Run Code Online (Sandbox Code Playgroud)

是否可以接受输入{}并对其应用简单的算术运算?我想提供end参数,例如:

$(({} + 100000 - 1))
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*ffy 5

xargs除非您告知外壳程序,否则不会调用外壳程序。因此,它不能独自执行外壳算术。

告诉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
' _
Run Code Online (Sandbox Code Playgroud)

尾部的下划线是的占位符$0,因此传递xargs给shell的值将分配给$1及以后。

-n参数控制每个sh调用运行多少个实例。当您接近输入批次的末尾时(当仍有少于P * n个值需要处理时),较低的值将导致较少的未使用CPU周期。较高的值将减少启动Shell实例时的CPU开销。

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