Bash 使用xargs输入的算术?

Bash 使用xargs输入的算术?,bash,xargs,Bash,Xargs,我有一个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

我有一个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
' _
后面的下划线是
$0
的占位符,因此
xargs
传递到shell中的值被分配给
$1
及更高版本

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


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

您的意思是
$({}+1000-1))
不是吗?否则,不知道;-/。祝你好运是的。这两种方法都不起作用。不管怎样,你为什么在这个场景中使用
xargs
?@CharlesDuffy的解决方案非常好,但我忍不住想,最简单的解决方案是修改你的python脚本,使其具有开始和长度,而不是开始和结束。这将避免在每个任务上启动额外的shell进程。@rici——一个很好的观点,我完全同意它的要点;不过,作为一个次要的挑剔,它是每16个任务启动一个shell,除非OP修改
-n
值。:)做得很好,加上很好的说明性和教育性。