мой .bashrc имеет следующую функцию
function myfile {
file $1
}
export -f myfile
это хорошо работает, когда я называю его непосредственно
rajesh@rajesh-desktop:~$ myfile out.ogv
out.ogv: Ogg data, Skeleton v3.0
это не работает, когда я пытаюсь вызвать его через должностное лицо
rajesh@rajesh-desktop:~$ find ./ -name *.ogv -exec myfile {} \;
find: `myfile': No such file or directory
существует ли способ вызвать функции сценария удара с должностным лицом?
Любая справка значительно ценится.
Спасибо за ответ Jim.
Но это точно, чего я хотел избежать во-первых, так как мне определили партию служебных функций в моих сценариях удара, я хотел использовать их с другими полезными командами, любят, находят - должностное лицо.
Я полностью вижу Вашу точку, хотя, находка может выполнить исполняемые файлы, она понятия не имеет, что аргумент передал, функция, определяемая в сценарии.
Я получу ту же ошибку, когда я попробую должностному лицу, находится на подсказке удара.
$ exec myfile out.ogv
Я надеялся, что может быть некоторый аккуратный прием, что должностному лицу можно было дать некоторую гипотетическую команду как "удар-myscriptname-myfunctionname".
Я предполагаю, что должен попытаться найти некоторый способ создать сценарий удара на лету и выполнить его с должностным лицом.
Вы можете заставить bash запускать функцию, поместив команду в stdIn bash:
bash$ find ./ -name *.ogv -exec echo myfile {} \; | bash
Приведенная выше команда будет работать для вашего примера , но вам нужно принять к сведению тот факт, что все команды ' myfile ...
' генерируются одновременно и отправляются одному процессу bash.
Я не думаю, что find
может это сделать, поскольку сама команда find
выполняет
команда, а не оболочка, в которой вы сейчас работаете ... поэтому функции или псевдонимы bash
там работать не будет. Если вы возьмете определение своей функции и превратите его в отдельный
bash-скрипт с именем myfile
, сделайте его исполняемым и установите где-нибудь на своем пути,
find
должен поступить с ним правильно.
$ 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?
$
где, конечно, функции могут быть немного сложнее моих примеров.
Скрипты дочерней оболочки, похоже, сохраняют родительские функции, поэтому вы можете выполнить сценарий, подобный этому один:
'runit.sh'
#! /bin/bash
"$@"
затем выполните find -name out.ogv -exec ./runit.sh myfile '{}' \;
и это работает! :)
Спасибо, Жоао. Это выглядит очень умным и элегантным решением. Небольшая проблема заключалась в том, что мне пришлось сначала создать свой скрипт для запуска функции 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
В любом случае большое спасибо.