Автор Тема: Не работает скрипт - Ошибка "плохой интерпретатор" [решено]  (Прочитано 11912 раз)

Оффлайн mentalDepression

  • Или мы остались в прошлом "настройка вручную", или мы находимся в будущем "компьютер делает сам".
  • Давно тут
  • **
  • Сообщений: 26
Приветствую вас, геймеры и хакеры :)

Если на компе "Альт Рабочая станция 8.2 (MATE)" создать исполняемый скрипт backup (в первой строке у него: #!/bin/sh) и вывести ярлык на рабочий стол, тогда он прекрасно выполняется.
Если на сервере "Альт Сервер 8.2 (MATE)" создать тоже самое, скрипт не работает. Смотрю в терминале
bash: backup: команда не найденаНу хорошо, добавим алиас в .bashrc
alias backup='/home/misha/home/script/backup'После этого он выдаст:
bash: /home/misha/home/script/backup: /bin/sh^M: плохой интерпретатор: Нет такого файла или каталогаКак это понимать? :) Почему бы не сделать как на рабочей станции? Зачем нам тратить время на это?
« Последнее редактирование: 22.09.2018 15:53:12 от Skull »
Или мы остались в прошлом "настройка вручную", или мы находимся в будущем "компьютер делает сам".

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
bash: /home/misha/home/script/backup: /bin/sh^M: плохой интерпретатор: Нет такого файла или каталогаКак это понимать? :)

Сервер из Калифорнии провайдера Fastly подсказывает:
https://stackoverflow.com/questions/15020883/unix-script-appends-m-at-end-of-each-line

Unix-ascii, это не то же самое что и Windows-ascii
Дефолт окончания строки в Horror Word на ZX Spectrum, это не то же самое что и в iS-Edit на том же ZX Spectrum :-)

Почувствуйте разницу:
$ cat bin-sh-1.txt
#!/bin/sh

# This is notepad from windows
$ hexdump -C bin-sh-1.txt
00000000  23 21 2f 62 69 6e 2f 73  68 0d 0a 0d 0a 23 20 54  |#!/bin/sh....# T|
00000010  68 69 73 20 69 73 20 6e  6f 74 65 70 61 64 20 66  |his is notepad f|
00000020  72 6f 6d 20 77 69 6e 64  6f 77 73                 |rom windows|
0000002b
$ cat bin-sh-2.txt
#!/bin/sh

# This is mcedit from linux (read as Unix)
$ hexdump -C bin-sh-2.txt
00000000  23 21 2f 62 69 6e 2f 73  68 0a 0a 23 20 54 68 69  |#!/bin/sh..# Thi|
00000010  73 20 69 73 20 6d 63 65  64 69 74 20 66 72 6f 6d  |s is mcedit from|
00000020  20 6c 69 6e 75 78 20 28  72 65 61 64 20 61 73 20  | linux (read as |
00000030  55 6e 69 78 29                                    |Unix)|
00000035

23 21 2f 62 69 6e 2f 73  68 0d
это и есть ваше
... /bin/sh^M: плохой интерпретатор: ...

0d в конце строки, это корректно в iS-Edit на ZX Spectrum, но не корректно для Unix/Linux-ASCII:
(скрипты в IS-DOS для ZX Spectrum содержат hex-код 0d в конце каждой строки; Unix-скрипты должны в конце строки содержать только hex-код 0a)
$ ./bin-sh-1.txt
bash: ./bin-sh-1.txt: /bin/sh^M: плохой интерпретатор: Нет такого файла или каталога
$ cat --show-nonprinting ./bin-sh-1.txt
#!/bin/sh^M
^M
echo 'This is notepad from windows'
$ hexdump -C bin-sh-1.txt
00000000  23 21 2f 62 69 6e 2f 73  68 0d 0a 0d 0a 65 63 68  |#!/bin/sh....ech|
00000010  6f 20 27 54 68 69 73 20  69 73 20 6e 6f 74 65 70  |o 'This is notep|
00000020  61 64 20 66 72 6f 6d 20  77 69 6e 64 6f 77 73 27  |ad from windows'|
00000030  0a                                                |.|
00000031

$ cmp $HOME/bin-sh-1.txt $HOME/bin-sh-2.txt
/home/user/bin-sh-1.txt /home/user/bin-sh-2.txt различаются: байт 10, строка 1
$ hexdump -C $HOME/bin-sh-1.txt
00000000  23 21 2f 62 69 6e 2f 73  68 0d 0a 0d 0a 65 63 68  |#!/bin/sh....ech|
00000010  6f 20 27 54 68 69 73 20  69 73 20 6e 6f 74 65 70  |o 'This is notep|
00000020  61 64 20 66 72 6f 6d 20  77 69 6e 64 6f 77 73 27  |ad from windows'|
00000030  0a                                                |.|
00000031
$ hexdump -C $HOME/bin-sh-2.txt
00000000  23 21 2f 62 69 6e 2f 73  68 0a 0a 23 20 54 68 69  |#!/bin/sh..# Thi|
00000010  73 20 69 73 20 6d 63 65  64 69 74 20 66 72 6f 6d  |s is mcedit from|
00000020  20 6c 69 6e 75 78 20 28  72 65 61 64 20 61 73 20  | linux (read as |
00000030  55 6e 69 78 29                                    |Unix)|
00000035

См. таблицу ASCII кодов на сайте или в каждой второй книге по ZX Spectrum на предмет Line Feed и Carriage Return:
https://www.ascii-code.com/
« Последнее редактирование: 22.09.2018 17:52:16 от Speccyfighter »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Приветствую вас, геймеры и хакеры :)

Если на компе "Альт Рабочая станция 8.2 (MATE)" создать исполняемый скрипт backup (в первой строке у него: #!/bin/sh) и вывести ярлык на рабочий стол, тогда он прекрасно выполняется.
Если на сервере "Альт Сервер 8.2 (MATE)" создать тоже самое, скрипт не работает. Смотрю в терминале
bash: backup: команда не найдена

См. в документации Unix/Linux/DOS/Windows переменную PATH

Оффлайн mentalDepression

  • Или мы остались в прошлом "настройка вручную", или мы находимся в будущем "компьютер делает сам".
  • Давно тут
  • **
  • Сообщений: 26
Всё, решил я у себя эту проблему. Огромное спасибо Speccyfighter.
Госссссподи, мы ещё должны помнить об окончаниях строк.... Да не должны мы помнить и знать, пускай OS делает такую проверку скрипта перед запуском и сам меняет на нужную, для успешного запуска.
Решение. У меня для текста установлен medit и он в меню позволяет выставить окончания строк, когда выставил Unix, всё заработало. На рабочей станции backup был Unix, а на сервере backup почему то оказался с окончаниями строк Windows (могло произойти, возможно я случайно поменял, так-как при создании нового файла на сервере ставится Unix).
Или мы остались в прошлом "настройка вручную", или мы находимся в будущем "компьютер делает сам".

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Госссссподи, мы ещё должны помнить об окончаниях строк....

:-) Ну а как же:
скриншоты