#!/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» уже давно сделан?

Попробовать, что ли, все-таки пообщаться с убунтовцами…

Закомментировать

Вам бы, по-хорошему, зарегистрироваться сначала надобно, прежде чем комментарии оставлять. Но, в порядке исключения, можете попробовать с OpenID проскочить, вдруг.