xargs只使用内置函数

时间:2015-04-13 17:36:43

标签: bash parameter-passing xargs

我正在努力加快数据库的处理速度。我迁移到xargs。但是我被严重困住了。如果xargs调用的命令不是内置的,则管道xargs的参数列表不起作用。我无法弄清楚原因。这是我的代码:

#!/bin/bash

list='foo
bar'

test(){
    echo "$1" 
}

echo "$list" | tr '\012' '\000' | xargs -0 -n1 -I '{}' 'test' {}

所以根本没有输出。并且测试功能永远不会被执行。但是,如果我用“echo”或“printf”替换“xargs”命令中的“test”,它可以正常工作。

4 个答案:

答案 0 :(得分:6)

您无法直接将shell函数传递给xargs,但您可以调用shell。

printf 'foo\0bar\0' |
xargs -r -0 sh -c 'for f; do echo "$f"; done' _

sh -c '...'内的东西可以是任意复杂的;如果你真的想,你可以宣布然后使用你的功能。但由于它简单且非递归,我只是简单介绍了它的功能。

虚拟下划线参数是因为sh -c 'script'之后的第一个参数用于填充$0

因为您的问题似乎与优化有关,我想您不想为传递给xargs的每个项目生成单独的shell - 如果您这样做,则没有什么会变得更快。所以我放入for循环,并将-I等参数取出xargs

答案 1 :(得分:4)

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

将代码移动到脚本或使用xargs将参数传递给外部命令。

答案 2 :(得分:4)

更改自:

echo "$list" | tr '\012' '\000' | xargs -0 -n1 -I '{}' 'test' {}

要:

export -f test
echo "$list" | tr '\012' '\000' | xargs -0 -n1 -I '{}' sh -c 'test {}'

答案 3 :(得分:0)

我已经看到了jac'的解决方案。在bbs.archlinux.org网站上,该网站使用非常有效的主要和辅助(从)脚本对。而不是内部功能'通常会接受单个$ 1参数,主要将参数列表发送到其辅助节点,其中while循环将列表中的每个成员作为连续的$ 1值处理。这是我用来应用'文件的样本对。对一堆可执行文件的命令,在我的例子中,所有可执行文件都以" em"开头。在文件名中。根据需要进行更改:

#!/bin/bash
# primary:  showfil
ls -l em* | grep  '^-rwx' | awk '{$1=$2=$3=$4=$5=$6=$7=$8=""; print $0}' | xargs -I% ~/showfilf "%"
~/showfilf fixmstr spisort trc
exit 0

#!/bin/bash
# secondary:  showfilf
myarch=$(uname -s | grep 'arwin')
while [[ -n "$1" ]]; do
  if [ -x "$1" ]; then
     if [ -n "$myarch" ]; then
        file "./$1"
     else
        myfile=$(file "./$1" | awk '{print $1" "$3" "$10" "$11" "$12}')
        myfile=${myfile%(uses}
        myfile=${myfile%for}
        echo "$myfile"
     fi
  fi
  shift
done
exit 0

此代码适用于Darwin(Mac)和Linux,以及其他系统。 ' grep'在主服务器中仅保留可执行文件,而不保留目录或符号链接。 ' awk'消除了前八个字段' ls'并保留文件名,该文件名将传递给' xargs',它会构建一个引用文件名列表以发送给' showfilf'。可以单独调用“showfilf”' showfilf'列表中有三个其他文件名。 ' showfilf'有一个while循环来处理列表。请注意,此处存在依赖于系统的代码,由“uname -s'和' grep'。最后,使这些脚本可执行,并将它们放在$ PATH上,例如$ HOME。如果您的$ PATH不包含您的$ HOME,我建议您在.bashrc或.bash_login中修改它,如下所示:export PATH = $ PATH:$ HOME