Sgt*_*kes 3 bash xargs parameter-passing
我正在努力加快数据库的处理速度.我迁移到xargs.但是我被严重困住了.如果xargs调用的命令不是内置的,则管道xargs的参数列表不起作用.我无法弄清楚原因.这是我的代码:
#!/bin/bash
list='foo
bar'
test(){
echo "$1"
}
echo "$list" | tr '\012' '\000' | xargs -0 -n1 -I '{}' 'test' {}
Run Code Online (Sandbox Code Playgroud)
所以根本没有输出.并且测试功能永远不会被执行.但是,如果我用"echo"或"printf"替换"xargs"命令中的"test",它可以正常工作.
您不能xargs直接传递shell函数,但可以调用shell.
printf 'foo\0bar\0' |
xargs -r -0 sh -c 'for f; do echo "$f"; done' _
Run Code Online (Sandbox Code Playgroud)
里面的东西sh -c '...'可以任意复杂; 如果你真的想,你可以宣布然后使用你的功能.但由于它简单且非递归,我只是简单介绍了它的功能.
伪下划线参数是因为后面的第一个参数sh -c 'script'用于填充$0.
因为你的问题似乎是关于优化的,我想你不想为每个传递给它的项目产生一个单独的shell xargs- 如果你这样做,没有什么会变得更快.所以我放入for循环并取出了-Ietc参数xargs.
小智 5
更改自:
echo "$list" | tr '\012' '\000' | xargs -0 -n1 -I '{}' 'test' {}
Run Code Online (Sandbox Code Playgroud)
到:
export -f test
echo "$list" | tr '\012' '\000' | xargs -0 -n1 -I '{}' sh -c 'test {}'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3430 次 |
| 最近记录: |