LINUX.ORG.RU
ФорумAdmin

Как рекурсивно выбрать файлы в portage?

 , ,


0

2

1. утилиту find не использовать, она внешняя, у неё коды ошибок и вообще...
2. есть специальный синтаксис у bash - https://stackoverflow.com/a/51695388/4158543
но куда втыкать эту опцию и не сломает ли переключение опций что-нибудь другое? Можно ли вообще надеятся, что portage работает на bash, а не на каком-нибудь sh?
3. Я поискал по https://devmanual.gentoo.org/eclass-reference/index.html но что-то не нашел функции для рекурсивного обхода

Да, я понимаю, что где-то на stackoverflow такой код может быть, но найти его не могу.

В итоге, кажется, надо будет читать как пишут циклы в bash, затем втыкать эти циклы в каждый ebuild, потому что всякими automake-ами для этой цели пользоваться было бы слишком просто.

например почему можно использовать echo */
но при этом в for почему-то обязательно запихивают вызов ls, хотя с первого взгляда кажется, что можно и без ls обойтись, указав сразу */ чтобы получить список директорий для рекурсивного обхода.

★★☆

Последнее исправление: Einstok_Fair (всего исправлений: 1)

Не знаю что ты хочеш сделать, но возможно тебе надо копать в сорону

/etc/portage/bashrc
anonymous
()

Я поискал по https://devmanual.gentoo.org/eclass-reference/index.html но что-то не нашел функции для рекурсивного обхода

Реурсия всегда выглядит очень просто, примерно так: parse() { for f in «$1»/*; do [[ -d $f ]] && parse «$f»; ... done } Для этого не надо делать особых алгоритмических фокусов «на память», как-бы само-собой очевидно. Применять bash вместо find полезно только тогда, когда у вас далее для простых файлов есть хитрый алгоритм, который зависит от бог знает чего - от имени каталога, от глубины рекурсии, от количества и так далее.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)

но при этом в for почему-то обязательно запихивают вызов ls

Кретины потому что.

for i in * во всех случаях лучше, чем for i in $(ls), за исключением случаев, когда ещё лучше подойдут find -exec, find -print0 | xargs -0 или хотя бы find -print0 | while read -rd $'\0' filename; do.

Касательно всяких ламерских высеров типа for i in $(ls) вот тебе корректное юниксовое файла к размышлению:

touch 'first\nline space$HOME
second line, are u ok?'
legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)

это сделано для обратной совместимости. в ebuild.sh

if ___eapi_enables_globstar; then
	shopt -s globstar
fi

в eapi.sh

___eapi_enables_globstar() {
	[[ ${1-${EAPI-0}} =~ ^(4-python|5-progress)$ ]]
}

Вообще, была идея убрать bash и сделать свой dsl для ebuild’ов, но похоже не судьба.

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