我的.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运行它。
答案 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
无论如何,非常感谢。