[Comm] sh - bash

Sergey Vlasov =?iso-8859-1?q?vsu_=CE=C1_altlinux=2Eru?=
Вс Окт 15 11:26:34 MSD 2006


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)) потенциально опасно, если
переменные могут содержать непроверенные данные, не являющися целыми
числами.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: Digital signature
Url     : <http://lists.altlinux.org/pipermail/community/attachments/20061015/c3d9b7e5/attachment-0003.bin>


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