我有一个xargs命令:
xargs -a es_doc_positions.txt -P 64 -I {} populate_es_index.py --start {} --end {}
是否可以接受输入{}
并对其应用简单的算术?我想提供类似的结论:
$(({} + 100000 - 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实例处理多个输入。