![查找函数、命令和内置函数](https://linux22.com/image/44676/%E6%9F%A5%E6%89%BE%E5%87%BD%E6%95%B0%E3%80%81%E5%91%BD%E4%BB%A4%E5%92%8C%E5%86%85%E7%BD%AE%E5%87%BD%E6%95%B0.png)
可能的重复:
在 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
.