xargs 输入算术?

arithmetic with xargs input?

我有一个 xargs 命令:

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

是否可以接受输入 {} 并对其应用简单的算法?我想提供类似这样的结束参数:

$(({} + 100000 - 1))

到目前为止,我尝试过的方法都没有成功。

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
' _

末尾的下划线是 [=13=] 的占位符,因此 xargs 传递给 shell 的值将分配给 </code> 和更高版本。</p> <p><code>-n 参数控制每个 sh 调用运行的实例数。当您接近输入批次的末尾时(当少于 P*n 值仍有待处理时),较低的值将导致较少的未使用 CPU 周期;更高的值将减少 CPU 启动 shell 个实例的开销。

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