On Sat, Nov 08, 2008 at 05:29:47PM +0300, Dmitry V. Levin wrote: > On Thu, Nov 06, 2008 at 07:13:31PM +0300, Alexey M. Tourbin wrote: > > --- a/scripts/0ldconfig.filetrigger > > +++ b/scripts/0ldconfig.filetrigger > [...] > > + # 0) Short circuit condition: if a library is already found, > > + # skip the remaining list of non-system libraries. Note that > > + # the input file list is sorted, and "/lic" collates after > > + # "/lib" and "/lib64". > > + if [ -n "$lib" ] && LC_ALL=C [ "$f" '>' "/lic" ]; then > > Тогда лучше написать без обиняков: [ "$f" '>' "/lib64" ] Не совсем. Нужно обрубать цикл только тогда, когда все файлы "/lib64/*" уже пройдены. А так любой файл "/lib64/*" будет больше "/lib64", а ведь флаг sys=1 ещё не выставлен. То есть то, что ты предлагаешь, -- неверно. Но идея понятна: условие окончание цикла можно выразить ещё немного более точно. Если во всех локалях "/lib64" > "/lib/" (цифра больше слеша), то в принципе можно сравнивать с "/lib7". Тут есть ещё одна тонкость, на которую я обратл внимание: в bash(1) сказано string1 > string2 True if string1 sorts after string2 lexicographically in the current locale. Но на самом деле в bash/test.c:binary_test() используется strcmp: 379 else if ((op[0] == '>' || op[0] == '<') && op[1] == '\0') 380 return ((op[0] == '>') ? (strcmp (arg1, arg2) > 0) : (strcmp (arg1, arg2) < 0)); то есть, вопреки документации, локаль не используется. А в ash(1) другая формулировка, которая вроде бы подразумевает strcmp: s1 > s2 True if string s1 comes after s2 based on the ASCII value of their characters. В общем, всё это заставило меня придумать вот такую странную, но вроде бы наиболее безопасную конструкцию.