как использовать функцию, определяемую удара в Вашем .bashrc с находкой - должностное лицо

мой .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".

Я предполагаю, что должен попытаться найти некоторый способ создать сценарий удара на лету и выполнить его с должностным лицом.

17
задан Bill the Lizard 14 April 2011 в 11:12
поделиться

5 ответов

Вы можете заставить bash запускать функцию, поместив команду в stdIn bash:

bash$ find ./ -name *.ogv -exec echo myfile {} \; | bash

Приведенная выше команда будет работать для вашего примера , но вам нужно принять к сведению тот факт, что все команды ' myfile ... ' генерируются одновременно и отправляются одному процессу bash.

5
ответ дан 30 November 2019 в 12:06
поделиться

Я не думаю, что find может это сделать, поскольку сама команда find выполняет команда, а не оболочка, в которой вы сейчас работаете ... поэтому функции или псевдонимы bash там работать не будет. Если вы возьмете определение своей функции и превратите его в отдельный bash-скрипт с именем myfile , сделайте его исполняемым и установите где-нибудь на своем пути, find должен поступить с ним правильно.

3
ответ дан 30 November 2019 в 12:06
поделиться
$ 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?
$ 

где, конечно, функции могут быть немного сложнее моих примеров.

6
ответ дан 30 November 2019 в 12:06
поделиться

Скрипты дочерней оболочки, похоже, сохраняют родительские функции, поэтому вы можете выполнить сценарий, подобный этому один:

'runit.sh'

#! /bin/bash

"$@"

затем выполните find -name out.ogv -exec ./runit.sh myfile '{}' \; и это работает! :)

2
ответ дан 30 November 2019 в 12:06
поделиться

Спасибо, Жоао. Это выглядит очень умным и элегантным решением. Небольшая проблема заключалась в том, что мне пришлось сначала создать свой скрипт для запуска функции 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

В любом случае большое спасибо.

1
ответ дан 30 November 2019 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: