LINUX.ORG.RU

[bash] Использование функции в find -exec

 


0

2

Почему нельзя использовать функцию, объявленную в скрипте командой function в команде find -exec myFunction?
Можно ли это как нибудь обойти?
Пытался написать скрипт вида (упростил для примера):

#!/bin/bash
function myFunction() {
#
#
}

find ./ -exec myFunction {} \;
, а выдаёт find: `myFunction': Нет такого файла или каталога

find — отдельная программа, ничего о баше и его внутренностях не знает, поэтому и не может использовать внутренние функции bash. Ищи способы обхода.

Если myFunction не привязана к текущему окружению bash, можно вставить её в отдельный файл-скрипт myfunction.sh и вызывать find -exec myfunction.sh.

Если привязана, то использовать файлы/каналы для организации взаимодействия с текущей оболочкой bash.

anonymous
()
Ответ на: комментарий от anonymous

Ясно, спасибо.
Самое обидное что разработчикам ничто не стоит добавить такую возможность в эту программу, но они не будут этого делать из-за своей консервативности, ради совместимости с морально устаревшим говном...

firestarter ★★★☆
() автор топика
Ответ на: комментарий от firestarter

firestarter> Самое обидное что разработчикам ничто не стоит добавить такую возможность в эту программу, но они не будут этого делать из-за своей консервативности, ради совместимости с морально устаревшим говном...

«Как у вас тут все запущено!» (с) доктор Шац

sdio ★★★★★
()
Ответ на: комментарий от firestarter

>Самое обидное что разработчикам ничто не стоит добавить такую возможность в эту программу

Встроить встроенный bash в find? А, может, ещё и го с гейшами добавить? :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Зачем же всё это. Достаточно возможности использовать свои функции в -exec, чтобы было удобно использовать find в скриптах.

firestarter ★★★☆
() автор топика
Ответ на: комментарий от firestarter

вы не понимаете сути

> Зачем же всё это. Достаточно возможности использовать свои функции в -exec, чтобы было удобно использовать find в скриптах.

функция есть в bash.

find в баше нет.

find не знает про баш.

find не имеет доступа к функциям в баш.

anonymous
()
Ответ на: вы не понимаете сути от anonymous

>find не имеет доступа к функциям в баш

Ну так я о том и говорю, если разработчики захотели бы, они бы могли напрограммировать чтобы имел.

firestarter ★★★☆
() автор топика
Ответ на: комментарий от KRoN73

Даже если в find встроить bash, то всё равно толку будет мало. Тут, как уже сообщил ТС, в find нужно напрограммировать такое, чтобы он мог читать функции вызвающего его скрипта, это покруче го будет :)

Мы, конечно, не будем рассматривать вариант встраивания find в bash, это не спортивно.

mky ★★★★★
()
Ответ на: комментарий от firestarter

>Достаточно возможности использовать свои функции в -exec

Вот для этого и придётся встроить bash в grep. Ибо функции - это возможности bash'а. Но не grep'а.

KRoN73 ★★★★★
()

А разве dbus придумана не для этого?

Вот включить в bash и find поддержку dbus. Тогда можно легко научить find вызывать какие-то другие функции.

Да, разработчики многих программ достаточно консервативны и еще не всюду есть поддержка dbus… Увы.

anarquista ★★★★★
()
Ответ на: комментарий от Lumi

Правда попытки пойти по цепочке ссылок в конце концов ведет в 404. Видимо сдох.

Lumi ★★★★★
()
Ответ на: комментарий от firestarter

>> Да ну, я лучше перепишу скрипт без find.

Но зачем? Кто мешает проделать нужные действия без -exec? Например, так

find ./ | while read dir; do
    my_func "$dir"
done
GotF ★★★★★
()
Ответ на: комментарий от firestarter

вам всё ещё не понятно?

> > find не имеет доступа к функциям в баш

Ну так я о том и говорю, если разработчики захотели бы, они бы могли напрограммировать чтобы имел.

- Моя бензиновая машина не ездит на всех видах бензина, только 95 и выше. И на дизеле не ездит. Почему нельзя заливать в неё любое топливо, что горит?

- У неё бензиновый двигатель, которому нужен 95-ый бензин.

- Ну так я о том и говорю, если разработчики захотели бы, они бы могли разработать машину, которая ездила на любом бензине, дизеле, угле и дровах.

Так понятнее?

anonymous
()
Ответ на: комментарий от GotF

>Но зачем? Кто мешает проделать нужные действия без -exec? Например, так

Спасибо, тоже вариант. Вообще у меня там не особо сложный случай, там можно и for X in «*/Dir» ...

firestarter ★★★☆
() автор топика
Ответ на: вам всё ещё не понятно? от anonymous

>- Ну так я о том и говорю, если разработчики захотели бы, они бы могли разработать машину, которая ездила на любом бензине, дизеле, угле и дровах.

А вы не сравнивайте виртуальный мир с реальным. Там всё ограничено законами физики, а тут только фантазией программистов.

firestarter ★★★☆
() автор топика
Ответ на: комментарий от demidrol

>> Да, разработчики многих программ достаточно консервативны и еще не всюду есть поддержка dbus… Увы.

это же шутка, да?

Нет, я серьезно. Я отнюдь не фанат dbus. Можно сделать было бы и лучше, и вкуснее. Но пока dbus остается единственным приемлемым решением, нет?

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

Пользователь мог бы обращаться к этим файлам как к обычным программам. Но это ведь более сложное решение, да?

Характерная черта UNIX — возможность взаимодействие между процессами. Любое такое взаимодействие — это хорошо. Любая попытка ограничить такое взаимодействие разумными рамками — это плохо. Говорить, что мол тут ничего нельзя поделать, потому что bash и find не знают друг про друга — это значит трусливо прятать голову в песок.

anarquista ★★★★★
()
Ответ на: комментарий от anarquista

> Но пока dbus остается единственным приемлемым решением, нет?

нет. dbus всего лишь один из многочисленных методов для организации ipc. и не самый удачный. примерно как xml для конфигов

ananas ★★★★★
()
Ответ на: комментарий от ananas

>export -f MyFunction

find ... -exec sh -c 'MyFynction {}' \;


Ого! Спасибо!

firestarter ★★★☆
() автор топика
Ответ на: комментарий от ananas

>export -f MyFunction

find ... -exec sh -c 'MyFynction {}' \;


А не работает. Выдаёт sh: MyFynction: not found

firestarter ★★★☆
() автор топика
Ответ на: комментарий от firestarter
function myFunction() {
	echo some command on file $1
}
export -f myFunction
find ~/tmp/ -exec bash -c 'MyFunction {}' \;

- а у меня не заработало =(

только такой кривой вариант:

find ~/tmp/ -exec sh -c \
"function MyFunction() { \
	echo some command on file \$1; \
}; \
MyFunction {}" \;

backbone ★★★★★
()

каждый пидор орать может, что разработчики пидоры, хотя сам ни бум-бум в программировании и даже программистского склада ума не имеет ;)

объясняю для тупых: bash и find ничего общего не имеют! find запускает программы как fork своего процесса, а потом заменяет его образом запускаемой программы и так и должно быть!!! чтобы запустить функцию скрипта bash, надо запустить bash с параметрами, которые скажут запущенному bash выполнить эту функцию :)

например имеем файл script.sh, в котором есть нужная функция, но мы не знаем где он лежит. script.sh выглядит так:

$ cat script.sh 
show_world () {
        echo "Hello world!"
}
чтобы выполнить из текущего bash эту функцию show_world надо выполнить:
$ . ./script.sh && show_world
Hello world!
следовательно, чтобы выполнить тоже самое из find надо выполнить:
$ find ./ -name script.sh -exec bash -c ". {} && show_world" \;
Hello world!

это что трудно?!?! я тоже этого не знал и за 5 минут чтения man bash и man find все это смекнул!!!

ТС бросай программирование!!! от таких как ты появляются всякие windows и другой индийский софт/код!!!

Theli
()
Ответ на: комментарий от Theli

>ТС бросай программирование!!! от таких как ты появляются всякие windows и другой индийский софт/код!!!

Свали. Иди в свой WoW играй, тут уже адекватные люди всё нормальным языком объяснили, за что им большое спасибо.

firestarter ★★★☆
() автор топика
Ответ на: комментарий от firestarter

> >- Ну так я о том и говорю, если разработчики захотели бы, они бы могли разработать машину, которая ездила на любом бензине, дизеле, угле и дровах.

А вы не сравнивайте виртуальный мир с реальным. Там всё ограничено законами физики, а тут только фантазией программистов.

1) Программы пишут реальные люди в реальном мире и тратят реальное время при этом кушая реальную еду.

2) По законам физики, сделать двигатели, которые будет работать на всём, что горит в нашей атмосфере - раз плюнуть (google паровая машина, например, топить можно дровами, углём, газом, бензином, соляркой, сливочным маслом)

3) Ну я уже не знаю, как тебе объяснить, что «сделать, чтоб всё было п№;%то» - сложно, дорого, долго, и, САМОЕ ГЛАВНОЕ, совершенно ненужно. Есть специализированные инструменты, которыми решают определенные задачи. Чем уже специализация - тем эффективней инструмент (сравни «разводной»/шведский ключ и набор головок + рожковых ключей + удлинители/трещётки)

anonymous
()
Ответ на: комментарий от anarquista

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

Пользователь мог бы обращаться к этим файлам как к обычным программам. Но это ведь более сложное решение, да?

Нет, это бредовое решение. Догадаетесь, почему?

На заметку: почитайте man env и поймите, где хранятся переменный окружения и как с ними работают.

Характерная черта UNIX — возможность взаимодействие между процессами. Любое такое взаимодействие — это хорошо. Любая попытка ограничить такое взаимодействие разумными рамками — это плохо.

Улыбнуло. Разумные ограничения по определению разумные. Вы предлагаете ограничивать неразумными рамками? Можете сказать, каким образом и как это вообще? ;)

Говорить, что мол тут ничего нельзя поделать, потому что bash и find не знают друг про друга — это значит трусливо прятать голову в песок.

Ещё один, не знающий и не владеющий русским? Сейчас УЖЕ ЕСТЬ две программы, которые ничего не знают друг о други (find не знает и не может интерпретировать функции bash). Следовательно, сейчас нет возможности напрямую вызывать функции. Ясно? То, что решить эту проблему можно - спора нет. Только зачем? Есть куча вариантов взаимодействия, для которых твои костыли не нужны.

anonymous
()
Ответ на: комментарий от ananas

> общие переменные тоже можно экспортировать

Общие переменные - это общие для чтения и записи. Вторую часть ты не сделаешь

В функции в bash у тебя полный доступ к environment'у шелла, съэмулировать это ты записью частей функции в файлы как ни старайся - не сможешь

anonymous
()
Ответ на: комментарий от anonymous

> съэмулировать это ты записью частей функции в файлы как ни старайся - не сможешь

в функции
echo -e «VAR1=$VAR1\nVAR2=$VAR2» > /tmp/var_env

и дальше в основном скрипте после find - source /tmp/var_env; rm -f /tmp/var_env


ananas ★★★★★
()
Ответ на: комментарий от Theli

Theli, Вы очень умные вещи пишите и пример отличный показали, за что Вам Большое Спасибо!
Но, пожалуйста, не реагируйте так эмоционально на чужие недостатки в знаниях, без этого общаться гораздо проще )

backbone ★★★★★
()
Ответ на: комментарий от firestarter

> Иди в свой WoW играй

я то на вов время не тратил (как и на все остальные игры), потому и не обвиняю никого в своей безграмотности ;)

Theli
()
Ответ на: комментарий от backbone

backbone, я вот на утро тоже подумал, что последнее пиво было лишним ;)

Theli
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.