в данный момент, переход на /bin/dash в качестве /bin/sh в целяз релиза Debian Squeeze http://wiki.debian.org/SqueezeReleaseGoals. В данный момент при установке тестинга Вы можете выбирать /bin/bash или /bin/dash будет по дефолту. В текущей стабильной версии дефолтный /bin/sh - это bash.
у топикстартера в шебанге написано /bin/sh. любой шелл, вызванный с таким именем, обязан эмулировать работу классического Bourne shell-а (не путать с bash — Bourne-again shell).
а в самом скрипте есть конструкции, отсутствующие в классическом Bourne shell-е. вот и shell и ругается.
_любой_ shell _обязан_ заругаться в такой ситуации.
у топикстартера в шебанге написано /bin/sh. любой шелл, вызванный с таким именем, обязан эмулировать работу классического Bourne shell-а (не путать с bash — Bourne-again shell).
Теоретиески -- обязан. Практически -- не всегда это делает в полной мере. Я как-то отправлял баг-репорт на TeXmacs по поводу того, что sh-скрипт из поставки работал корректно только когда sh была ссылкой на bash.
sh-скрипт из поставки работал корректно только когда sh была ссылкой на bash
вот яркий пример и того и другого. скриптописатель употребил bash-специфичные конструкции, но в shebang-е поставил /bin/sh.
а мэйнтэйнеры bash-а разрешили ему плевать на shebang.
симбиоз (улыбка)
sh-скрипт из поставки работал корректно только когда sh была ссылкой на bash
вот яркий пример и того и другого. скриптописатель употребил bash-специфичные конструкции, но в shebang-е поставил /bin/sh.
а мэйнтэйнеры bash-а разрешили ему плевать на shebang.
симбиоз (улыбка)
Беда только в том, что у них не получилось симбиоза с мэйнтэйнерами dash-а (кто от него у меня зависел, уж не помню), которые услужливо предложили сделать sh ссылкой на dash, а нём эти конструкции, очевидно, не сработали. (: И это хорошо, что у меня "уровень важности" debconf обычно стоит на минимуме, а то ведь могли бы и не спросить -- тогда и догадаться, в чём проблема, было бы непросто.
возвращаясь к первоистокам:
надо бить по рукам тех, кто ставит неправильный shebang.
и наступит «благорастворение на воздусях и во человецех благоволение.» (улыбка)
возвращаясь к первоистокам:
надо бить по рукам тех, кто ставит неправильный shebang.
и наступит «благорастворение на воздусях и во человецех благоволение.» (улыбка)
у топикстартера в шебанге написано /bin/sh. любой шелл, вызванный с таким именем, обязан эмулировать работу классического Bourne shell-а (не путать с bash — Bourne-again shell).
а в самом скрипте есть конструкции, отсутствующие в классическом Bourne shell-е. вот и shell и ругается.
_любой_ shell _обязан_ заругаться в такой ситуации.
Вот в Advanced Bash Scripting Guide тоже написано
Note again that #!/bin/sh invokes the default shell interpreter, which
defaults to /bin/bash on a Linux machine.
Тут указана строка /bin/bash а про то, что он классический или еще какой-то ничего. Как прикажете понимать?
Видите ли, программы могут изменять свое поведение в зависимости от того, под каким именем их запускают. Вот простенький пример:
halt/reboot
$ file /sbin/halt
/sbin/halt: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, stripped
$ file /sbin/reboot
/sbin/reboot: symbolic link to `halt'
Как видите, reboot - всего лишь символическая ссылка на halt, но одинаковый ли результат вы получите после запуска этих команд? ;)
Теперь очередь sh и bash:
sh/bash
$ file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, stripped
$ file /bin/sh
/bin/sh: symbolic link to `bash'
Итак, sh нет, есть bash. Но если вы запустите именно sh (или укажете в скрипте #!/bin/sh), то bash запустится в режиме "классического sh" и вам станут (по крайней мере, должны стать) недоступны bash-специфичные фишки. С чего, собственно, и началась эта тема. :)