如何使用find -exec在.bashrc中定义的bash函数

时间:2010-06-16 20:06:35

标签: bash function find exec

我的.bashrc具有以下功能

function myfile {
 file $1
}
export -f myfile

直接调用它时工作正常

rajesh@rajesh-desktop:~$ myfile out.ogv 
out.ogv: Ogg data, Skeleton v3.0

当我尝试通过exec

调用它时,它不起作用
rajesh@rajesh-desktop:~$ find ./ -name *.ogv -exec myfile {} \;
find: `myfile': No such file or directory

有没有办法用exec调用bash脚本函数?

非常感谢任何帮助。

更新

感谢Jim的回应。

但这正是我想要首先避免的,因为我在bash脚本中定义了很多实用函数,我想将它们与其他有用的命令一起使用,比如find -exec。

我完全看到了你的观点,发现可以运行可执行文件,它不知道传递的参数是在脚本中定义的函数。

当我尝试exec处于bash提示符时,我会得到同样的错误。

$ exec myfile out.ogv

我希望有一些巧妙的技巧可以给exec一些假设的命令,比如“bash -myscriptname -myfunctionname”。

我想我应该尝试找到一些方法来动态创建一个bash脚本并使用exec运行它。

8 个答案:

答案 0 :(得分:7)

find ./ -name *.ogv -exec bash -c 'myfile {}' \;

答案 1 :(得分:7)

我设法以更优雅的方式运行它:

function myfile { ... }
export -f myfile
find -name out.ogv -exec bash -c '"$@"' myfile myfile '{}' \;

请注意,myfile会被给予两次。第一个是脚本的$0参数(在这种情况下,它基本上可以是任何东西)。第二个是要运行的函数的名称。

答案 2 :(得分:6)

$ cat functions.bash
#!/bin/bash

function myecho { echo "$@"; }
function myfile { file "$@"; }
function mycat { cat "$@"; }

myname=`basename $0`
eval ${myname} "$@"
$ ln functions.bash mycat
$ ./mycat /etc/motd
Linux tallguy 2.6.32-22-core2 ...
$ ln functions.bash myfile
$ myfile myfile
myfile: Bourne-Again shell script text executable
$ ln functions.bash myecho
$ myecho does this do what you want\?
does this do what you want?
$ 

当然,这些功能可能比我的例子更复杂。

答案 3 :(得分:5)

你可以通过将命令放入bash的StdIn:

来获得bash来运行一个函数
bash$ find ./ -name *.ogv -exec echo myfile {} \; | bash

上面的命令适用于您的示例您需要注意所有“myfile...”命令一次生成并发送到单个bash进程的事实

答案 4 :(得分:3)

我不认为find可以做到这一点,因为它是find命令本身正在执行 命令,而不是您当前正在运行的shell ...所以bash函数或别名 不会在那里工作。如果您采用函数定义并将其转换为单独的函数 bash脚本名为myfile,使其可执行,并将其安装在您的路径上某处, find应该用它做正确的事。

答案 5 :(得分:3)

更简单

function myfile { echo $* ; }
export -f myfile

find . -type f -exec bash -c 'myfile "{}"'  \;

答案 6 :(得分:2)

子shell脚本似乎保留了父函数,因此您可以执行与此类似的脚本:

'runit.sh'

#! /bin/bash

"$@"

然后做find -name out.ogv -exec ./runit.sh myfile '{}' \; 它的工作原理! :)

答案 7 :(得分:1)

谢谢Joao。这看起来非常聪明和优雅的解决方案。小问题是我必须首先来源我的脚本以运行myfile功能,例如我从你的建议中借鉴了我的runint.sh如下

#!/bin/bash
script_name=$1
func_name=$2
func_arg=$3
source $script_name
$func_name $func_arg

现在我可以按如下方式运行它

$ find ./ -name *.ogv -exec ./runit.sh ~/.bashrc myfile {} \;
./out.ogv: Ogg data, Skeleton v3.0

否则我得到了

$ find ./ -name *.ogv -exec ./runit.sh myfile {} \;
./runit.sh: 1: myfile: not found
无论如何,非常感谢。