[devel] Re: %NotRequires/%NotProvides RPM macros

Alexey Tourbin at на altlinux.ru
Ср Май 26 16:14:48 MSD 2004


On Wed, May 26, 2004 at 02:51:23PM +0400, Dmitry V. Levin wrote:
> > %NotRequires perl(warnings.pm) libz.so.1
> > %NotProvides perl(PerlIO/gzip.pm)
> - имена странные

Для сравнения.

В MDK нужно писать:
%define _requires_exceptions 'perl(warnings.pm)' libz.so.1

В PLD нужно писать:
%define _noautoreq 'perl(warnings.pm)' libz.so.1

По сравнению с MDK/PLD суть моих предложений в следующем:

- удобнее писать не %define, а использовать готовый макрос,
  семантика которого очевидна из названия
- удобнее использовать shell patterns, а не `grep -v'
- удобнее использовать автоматическое кворитрование аргументов,
  передаваемых скрипту

Т.е. получается больше похоже на тэги Requires и Provides, что
кажется мне более естественным.

> - так на shellе не пишут:
> strings=`"$@"`
> echo "$strings" | while read string; do

Я уже запутался, в каком порядке происходят substitutions, word
splitting и т.д., как это связано с субшеллами, backticks,
embedded newlines и т.п.

Заодно узнал, что в bash субшелл порождается для _правой_ части пайпа,
а левая часть пайпа остается работать в текущем шелле.  (В zsh это
работает с точностью до наоборот.)

Поэтому в bourne shell не работает такой очевидный, казалось бы, код:

echo "$strings" | while read string; do
	match=	
	echo "$patterns" | while read pattern; do
		if [ -z "${string##$pattern}" ]; then
			match=1
			break
		fi
	done
	if [ -z "$match" ]; then
		echo "$string"
	fi
done

Т.е. match=1 устанавливается в дочернем процессе, а по команде break
субшелл радостно прекращает свою работу.  Чево только не узнаешь. :)

> -- 
> ldv
----------- следущая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : отсутствует
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: отсутствует
Url     : http://lists.altlinux.ru/pipermail/devel/attachments/20040526/d4387967/attachment.bin


Подробная информация о списке рассылки Devel