Anarchist
написал 3 сентября 2008 года в 14:44 (2110 просмотров)
Ведет себя
как мужчина; открыл 258 тем в форуме, оставил 4097 комментариев на сайте.
FreeBSD 6.2-RELEASE #0
expr $RANDOM % 4
Отрабатывает как и предполагалось, как и надо.
Но стоит только вставить в скрипт следующего содержания (запускаемый тут же):
#!/usr/local/bin/bash expr $RANDOM % 4 exit 0
expr: syntax error
Раньше (когда был bash постарее) — работало прекрасно.
В чём проблема?
ЗЫ: Проврил на своей рабочей станции (Gentoo Linux).
app-shells/bash
Installed versions: 3.2_p33
Всё работает. Бзди-специфичная бага.
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
Поставь «;» на всякий случай.
Эффект тот же.
При изменении интерпретатора на /bin/sh — аналогично.
А переменная $RANDOM там определена? Похоже, проблема в этом. Может, какой ее аналог поискать надо…
Шурупов. Ты невнимателен. Не выспался?
Я же писал, что
работает как и предполагается.
Проблемы начинаются когдя я пробую генерить случайные числа в скрипте.
Если бы переменная RANDOM не была определена, они бы начались намного раньше.
А ты не наблюдателен.
Добавь «echo $RANDOM» в этом своем скрипте и увидишь, что переменная в окружении скрипта не определена.
Через bash ли ты его вообще вызываешь? У меня через bash все окей, через sh — твоя ошибка, а $RANDOM не определена.
Угу.
Всё. Блин. Сам дурак.
Короче, назначать бит 'x' мне было естественно в лом.
Скрипт пускал посредством
Ну и он при таком обращении не отрабатывал как положено первую строку скрипта
В Gentoo Linux тот же эксперимент отрабатывался ПОЛНОСТЬЮ адекватно.
> Скрипт пускал посредством
О! Ч. и т.д. Я, к счастью, сначала сделал то же самое и тогда осознал проблему.
> В Gentoo Linux тот же эксперимент отрабатывался ПОЛНОСТЬЮ адекватно.
Я не уверен, что Gentoo Linux при этом прав. Но это уже совсем другая тема…
Предлагаю
пофлеймитьобсудить какое поведение здесь является правильным :)Оно «неправильное». Мне тут даже продемонстрировали, почему:
:-D
Вообще bash должен вести себя как sh если его запустили как sh.
А если в Gentoo нет самого sh, то кто гарантирует полную «эмуляцию» башем оригинального шелла?
И вообще в ArchLinux:
У меня одинаково работает и sh test.sh, и при обычном запуске, причем независимо от того, какой интерпретатор.
А sh там есть? Или тоже symlink на bash? ;-)
Конечно symlink :D
Думаю это все-таки ошибка в современных версиях bash. RANDOM это фишка именно bash, если верить man.
Почему ошибка? Просто bash не хочет себя вести как sh ;-)
Из man bash.
Думаю тут сохранить совместимость нет проблем, не даром в debian занялись dash.
В Ubuntu вот как раз sh ссылается на dash и отрабатывает, как описал Анархист ($RANDOM не определена).
Ну и что?
Здесь разницы между sh || bash || csh || что ещё по вкусу быть не должно.
Интерпретатор (не важно какой) читает первую строку файла
А дальше он по идее должен был бы запустить этот самый /usr/local/bin/bash и остальную часть скрипта интерпретировать как команды интерпретатора указанного в заголовке.
С этой точки зрения сущность (и степень определённости в нём переменной RANDOM) /bin/sh (если только он является адекватным Unix’овым командным процессором): симлинки ли он и если симлинк, то на что указывает — совершенно не важна.
Чем мне нравится Gentoo, так это отсутствием лишних компонентов.
С чего бы это он должен что-то еще запускать?! Он игнорирует команду, начинающуюся с «#!».
В man по bash учет «#!» упоминается только в контексте файлов. В остальных случаях «#» — комментарий, так что уже неважно, что там идет после…
Насколько я помню читанную в древние времена документацию, '#' конечно обозначает комментарий и часть строки следующая за ним игнорируется.
Но для первой строки файла — особый подход. Если после него идёт восклицательный знак путь к программе, то остальная часть файла интерпретируется как входные данные для этой программы.
Или это — личные заморочки писавшего?
bash здесь совершенно ни при чём!
Это — более основополагающий уровень!
Помнится, шаманил я с какой-то криво портированной программкой под фрёй. Были там скрипты.
Строка в заголовке
Естественно не работает (ну нету такого файла).
Меняю на
Не работает. Скрипт написан в расчёте на функциональность bash’а.
Исправляю на
И всё работает.
Если бы '#' всегда и везде означал комментарий — такого бы не было.
Осталось формализовать участие во всём этом бита исполнения — и будет полное счастье.
Особый подход к #! имеет системный загрузчик, а для всего остального это просто «#!».
В таком случае как ты объяснишь мой предыдущий комментарий?
А я не вижу противоречий.
Интересно…
Дело ведь в том, что я говорю про в-общем-то обыкновенные скрипты, которые с системным загрузчиком никаким боком не пересекаются.
Если ты их запускал
$ sh script
тогда, действительно странно.
А если:
$ ./script
то это обслуживает системный загрузчик.
Это я и имел в виду, когда говорил о роли бита исполнения.
Благодарю за уточнение.