On Sun, Oct 15, 2006 at 08:53:03AM +0300, Artem Zolochevskiy wrote: > Pavel Usischev wrote: > >> Собственно вопрос относительно написания скриптов > >> Отчего же тогда вижу везде #!/bin/sh (в стартовых сценариях итп) - если > >> этот sh такой старый и неумека? > > > > Как раз для переносимости скрипта. В ALT /bin/sh -- это особый вариант > > bash, в других системах это вполне может быть другой шелл, а bash вообще > > может отсутствовать. > > Так вот и я так думал, а получается, что нет. Ибо в альтовских скриптах > (благодаря тому, что в альт sh это тот же bash) повсеместно используются > фичи, кот в "оригинальном" sh не прокатят. Получается о совместимости тут > речи нет. В Debian /bin/sh может ссылаться на любой POSIX compatible shell: The standard shell interpreter /bin/sh can be a symbolic link to any POSIX compatible shell, if echo -n does not generate a newline. http://www.debian.org/doc/debian-policy/ch-files.html#s-scripts У нас пока такого нет, но всё равно лучше в скриптах, где написано #!/bin/sh, не использовать возможности, специфические для bash. > альтовский sh: > sh-3.1$ A=5 > sh-3.1$ B=6 > sh-3.1$ C=$(($A+$B)) > sh-3.1$ echo $C > 11 > sh-3.1$ > > а по идее в sh это не должно прокатывать > heirloom-sh: > $ A=5 > $ B=6 > $ C=$(($A+$B)) > syntax error: `C=$' unexpected > $ Это arithmetic expansion, который вообще-то входит в последний вариант спецификации POSIX sh: http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_04 Правда, в стандарте есть одна проблема: там написано, что $(($x) и $((x)) должны работать одинаково, но возможность использовать переменные без $ в произвольных выражениях явно не прописана; в результате существуют варианты /bin/sh, для которых заявлена совместимость с POSIX, но выражения вида $((A+B)) там не работают. Использование же конструкций вида $(($A+$B)) потенциально опасно, если переменные могут содержать непроверенные данные, не являющися целыми числами.