Bad substitution

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
ripke
Сообщения: 85
ОС: Ubuntu 9.04, x86_64

Bad substitution

Сообщение ripke »

Надо конвертировать файлы ppm в jpg. Нашел такой скрипт

Код: Выделить всё

#!/bin/sh
for pic in *.ppm
do
pnmtojpeg ${pic} > ${pic/%ppm/jpg}
done

Пишет,что плохая подстановка. Как я понял %ppm это конец шаблона, т.е. расширение файла, а jpg - на это надо заменить. Что-то не выходит.
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Bad substitution

Сообщение sciko »

Заменить
#!/bin/sh
на
#!/bin/bash

ЗЫ. Вроде бы в dash другой формат подстановок.
Спасибо сказали:
Аватара пользователя
ripke
Сообщения: 85
ОС: Ubuntu 9.04, x86_64

Re: Bad substitution

Сообщение ripke »

Да, спасибо, помогло.
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Bad substitution

Сообщение sciko »

Модераторам: может сделать FAQ на это раздел и поместить туда вопрос о том, что в дебиане и его кланах sh -- это dash, а не bash?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Bad substitution

Сообщение diesel »

sciko писал(а):
23.04.2010 16:46
Модераторам: может сделать FAQ на это раздел и поместить туда вопрос о том, что в дебиане и его кланах sh -- это dash, а не bash?

не всегда.
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Bad substitution

Сообщение sciko »

diesel писал(а):
23.04.2010 16:49
не всегда.
Пример?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Bad substitution

Сообщение diesel »

sciko писал(а):
23.04.2010 16:52
diesel писал(а):
23.04.2010 16:49
не всегда.
Пример?

в данный момент, переход на /bin/dash в качестве /bin/sh в целяз релиза Debian Squeeze http://wiki.debian.org/SqueezeReleaseGoals. В данный момент при установке тестинга Вы можете выбирать /bin/bash или /bin/dash будет по дефолту. В текущей стабильной версии дефолтный /bin/sh - это bash.
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Bad substitution

Сообщение sciko »

В любом случае, думаю надо этот вопрос закрепить в FAQ, т.к. часто его слышу.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Bad substitution

Сообщение sash-kan »

sciko
при чём тут sh-dash-bash?

у топикстартера в шебанге написано /bin/sh. любой шелл, вызванный с таким именем, обязан эмулировать работу классического Bourne shell-а (не путать с bash — Bourne-again shell).
а в самом скрипте есть конструкции, отсутствующие в классическом Bourne shell-е. вот и shell и ругается.
_любой_ shell _обязан_ заругаться в такой ситуации.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Bad substitution

Сообщение t.t »

sash-kan писал(а):
23.04.2010 18:20
у топикстартера в шебанге написано /bin/sh. любой шелл, вызванный с таким именем, обязан эмулировать работу классического Bourne shell-а (не путать с bash — Bourne-again shell).
Теоретиески -- обязан. Практически -- не всегда это делает в полной мере. Я как-то отправлял баг-репорт на TeXmacs по поводу того, что sh-скрипт из поставки работал корректно только когда sh была ссылкой на bash.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Bad substitution

Сообщение sash-kan »

t.t писал(а):
23.04.2010 19:19
Практически
практически имеем добросердечных мэйнтэйнеров, помогающих обойти неинформированность скриптописателей о том, что же такое shebang.

t.t писал(а):
23.04.2010 19:19
sh-скрипт из поставки работал корректно только когда sh была ссылкой на bash
вот яркий пример и того и другого. скриптописатель употребил bash-специфичные конструкции, но в shebang-е поставил /bin/sh.
а мэйнтэйнеры bash-а разрешили ему плевать на shebang.
симбиоз (улыбка)
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Bad substitution

Сообщение t.t »

sash-kan писал(а):
23.04.2010 20:30
t.t писал(а):
23.04.2010 19:19
sh-скрипт из поставки работал корректно только когда sh была ссылкой на bash
вот яркий пример и того и другого. скриптописатель употребил bash-специфичные конструкции, но в shebang-е поставил /bin/sh.
а мэйнтэйнеры bash-а разрешили ему плевать на shebang.
симбиоз (улыбка)
Беда только в том, что у них не получилось симбиоза с мэйнтэйнерами dash-а (кто от него у меня зависел, уж не помню), которые услужливо предложили сделать sh ссылкой на dash, а нём эти конструкции, очевидно, не сработали. (: И это хорошо, что у меня "уровень важности" debconf обычно стоит на минимуме, а то ведь могли бы и не спросить -- тогда и догадаться, в чём проблема, было бы непросто.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Bad substitution

Сообщение sash-kan »

возвращаясь к первоистокам:
надо бить по рукам тех, кто ставит неправильный shebang.
и наступит «благорастворение на воздусях и во человецех благоволение.» (улыбка)
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Bad substitution

Сообщение t.t »

sash-kan писал(а):
24.04.2010 17:17
возвращаясь к первоистокам:
надо бить по рукам тех, кто ставит неправильный shebang.
и наступит «благорастворение на воздусях и во человецех благоволение.» (улыбка)
Остаётся только присоединиться.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
ripke
Сообщения: 85
ОС: Ubuntu 9.04, x86_64

Re: Bad substitution

Сообщение ripke »

sash-kan писал(а):
23.04.2010 18:20
sciko
при чём тут sh-dash-bash?

у топикстартера в шебанге написано /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 а про то, что он классический или еще какой-то ничего. Как прикажете понимать?
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Bad substitution

Сообщение allez »

Видите ли, программы могут изменять свое поведение в зависимости от того, под каким именем их запускают. Вот простенький пример:

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-специфичные фишки. С чего, собственно, и началась эта тема. :)
Спасибо сказали: