xargs只使用内置函数

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",它可以正常工作.

tri*_*eee 6

您不能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.


Ala*_*ack 5

xargs将可执行文件作为参数(包括自定义脚本)而不是环境中定义的函数。

将您的代码移动到脚本中,或用于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)