查找函数、命令和内置函数

查找函数、命令和内置函数

可能的重复:
在 find -exec 调用中执行用户定义函数

假设我有以下 bash 代码:

!#/bin/bash
function  print_echo (){
    echo "This is print_echo Function" $1;
}
find ./ -iname "*" -exec print_echo {} \;

对于每个-exec命令我都会收到以下错误:

find: `print_echo': No such file or directory

注意:在此之前,我测试了一个关键程序,并用另一种算法解决了我的程序,但这是一个问题:为什么 find 命令不接受内置 bash 命令和函数名称作为 的参数-exec

答案1

我不知道为什么find不喜欢功能。解决方法如下:

#!/bin/bash
function  print_echo (){
    echo "This is print_echo Function" $1;
}

for f in $(find . -iname "*")
do
    print_echo $f
done

更新

上述脚本不适用于嵌入空格的文件。以下更新的作用是:

#!/bin/bash
function  print_echo (){
    echo "This is print_echo Function" $1;
}

find . -iname "*.sh" | \
while read f
do
    print_echo "$f"
done

答案2

find接受您的函数作为命令,因为它的-exec谓词字面上调用 C 库exec函数来启动程序。您的函数仅适用于 bash 解释器本身。即使您在.bashrc文件中定义了函数,它也仅对bash.

因此,如果您确实需要两次执行 find 的-exec一些自定义命令序列,请将其放入单独的脚本文件中或使用其他解决方法。

答案3

-exec您可以在find 的参数中启动 bash 解释器。如果您的函数一次只接受一个文件名,则这种方法效率不高,因为每次都必须重新声明该函数。您可以对其进行设计,使其接受文件列表并使用+终止符进行查找,以便 shell 仅生成一次。这是一个例子。

find -exec bash -c '
    print_echo() { 
        printf "This is print_echo Function: %s\n" "$@" 
    }
    print_echo "$@"
    ' find-bash {} +

此时,没有理由声明该函数。只需执行该函数在bash -c.

相关内容