#!/bin/sh
12.11.2006 22:22:43После обновления UbuntuK’а с Dapper на Edgy заметил странное: в шелл-скриптах перестали разворачиваться выражения типа dir/blah.{c,o}, то есть, с фигурными скобочками. Больших проблем не создавало, поэтому для начала забил.
А тут вот понадобилось собрать busybox, как обычно, кроссом, а он никак не хочет. Попробовал прямую сборку даже, то же самое. Выяснилось, что я не первый, кто с таким столкнулся, был еще один, причем, исправление, предложенное товарищем далее, оказалось вполне рабочим. Я себе даже быренько сварганил патч, приблизительно такого вида:
--- busybox-1.2.2.1/scripts/config/mkconfigs.old 2006-07-01 02:42:01.000000000 +0400 +++ busybox-1.2.2.1/scripts/config/mkconfigs 2006-11-11 19:19:10.882527750 +0300 @@ -46,6 +46,6 @@ echo \ */" echo "static const char * const bbconfig_config =" -echo "`sed 's/\"/\\\\\"/g' $config | grep "^#\? \?CONFIG_" | awk '{print "\\"" $0 "\\\\n\\"";}'`" +echo "`sed 's/\"/\\\\\"/g' $config | grep "^#\? \?CONFIG_" | awk '{print "\\"" $0 "\\"";}'`" echo ";" echo "#endif /* _BBCONFIGOPTS_H */"
Вроде можно и успокоиться, но как-то не получается, особенно если посмотреть, что оригинальный скрипт должен выплевывать вот так:
... static const char * const bbconfig_config = "# CONFIG_NITPICK is not set\n" "# CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set\n" "# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set\n" ...
Скрипт на Edgy вываливает вот так:
... static const char * const bbconfig_config = "# CONFIG_NITPICK is not set " "# CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set " "# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set " ...
А скорректированная для edgy версия выплевывает вот такое:
... static const char * const bbconfig_config = "# CONFIG_NITPICK is not set" "# CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set" "# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set" ...
Все это не сильно даже страшно, однако ж, эта зараза вполне прилично вела себя на Dapper без всяких исправлений! А скорректированный результат все ж не равен оригинальному.
В общем, пока все это колбасилось, я уже почти написал письмо разработчикам busybox, потом чуть было не забил баг в Launchpad Ubuntu, а потом обнаружил интересное. Многие замечательные скрипты имеют привычку начинаться со строки «#!/bin/sh«, что сообщает, собственно, чем его интерпретировать. Естественно, что в замечательных системах GNU/Linux в качестве основного шелла массово используется bash, а /bin/sh, соответственно, чисто символично указывает на него. Все к этому привыкли, все счастливы.
Кроме замечательных убунтовцев, конечно. А может даже и дебьяновцев, это еще проверки требует. Но как бы там ни было, помимо новехонького upstart нам приготовили еще одно изменение: помимо bash в системе установлен dash, который, как говорит apt-cache,
Description: The Debian Almquist Shell
«dash» is a POSIX compliant shell that is much smaller than «bash».
We take advantage of that by making it the shell on the installation
root floppy, where space is at a premium.
.
It can be usefully installed as /bin/sh (because it executes scripts
somewhat faster than «bash»), or as the default shell either of root
or of a second user with a userid of 0 (because it depends on fewer
libraries, and is therefore less likely to be affected by an upgrade
problem or a disk failure). It is also useful for checking that a
script uses only POSIX syntax.
.
«bash» is a better shell for most users, since it has some nice
features absent from «dash», and is a required part of the system.
Ну и, конечно же, с его установкой /bin/sh стал указывать на /bin/dash! Который в принципе не может нормально переварить «\n» в скрипте (никакое экранирование так и не помогло), а также не поддерживает разворачивание конструкций в фигурных скобках. Но он шустрый и, наверняка, отлично совместим с обновленными скриптами init для upstart.
Как результат, даже и не знаешь, кому пожаловаться. С одной стороны, невозможность экранирования «\n» попахивает багом, с другой, раз уж хочется использовать bash, можно писать «#!/bin/bash» в скриптах, с третьей, а какая собственно, разница, если «rm /bin/sh; ln -s bash /bin/sh» уже давно сделан?
Попробовать, что ли, все-таки пообщаться с убунтовцами…