Не работает скрипт

Форум поддержки для русскоязычных пользователей
Forum rules
Topics in this forum are automatically closed 6 months after creation.
Locked
stiks999

Не работает скрипт

Post by stiks999 »

Добрый день, коллеги!
Я начинающий пользователь Linux.
Объясните мне, пожалуйста, почему не работает мой скрипт test.sh?
Скрипт не сложный вроде:

Code: Select all

sed -i '15d;58,61d;14r 1.xml' test1.xml
Скрипт удаляет в файле test1.xml 15-ю строку и с 58 по 61 строку, после 14 строки файла вставляет текст из файла 1.xml.

В папке лежат 3 файла 1.xml, test1.xml, test.sh. В этой папке нажимаю правой кнопкой мыши на свободном месте, в контекстном меню выбираю "открыть в терминале", ввожу команду sh test.sh (или sudo sh test.sh) то получаю:

: Нет такого файла или каталога.xml
: not found test.sh

НО! Если просто руками ввожу ту же самую команду sed -i '15d;58,61d;14r 1.xml' test1.xml то все работает как задумано!

Пробовал разделять команды для упрощения типа

Code: Select all

sed -i '15d;58,61d;' ./test1.xml && sed -i '14r ./1.xml' ./test.xml
Тоже фигня выходит, но по отдельности, при ручном вводе в терминал, команды отрабатывают правильно.
Задача то вроде простая, но 2 дня не могу победить, что я делаю не так?
Last edited by LockBot on Wed Dec 28, 2022 7:16 am, edited 1 time in total.
Reason: Topic automatically closed 6 months after creation. New replies are no longer allowed.
t42
Level 11
Level 11
Posts: 3744
Joined: Mon Jan 20, 2014 6:48 pm

Re: Не работает скрипт

Post by t42 »

Your shell is echo "$SHELL"

Code: Select all

$ echo "$SHELL"
/bin/bash
so

Code: Select all

/bin/bash ./test.sh
or

Code: Select all

chmod +x test.sh
./test.sh 
still you can use sh

Code: Select all

sh ./test.sh
-=t42=-
stiks999

Re: Не работает скрипт

Post by stiks999 »

Спасибо за ответ, но у меня вот что получается

Code: Select all

user@XFCE-Mint:~/Рабочий стол/sed$ echo "$SHELL"
/bin/bash

user@XFCE-Mint:~/Рабочий стол/sed$ /bin/bash .test.sh
/bin/bash: .test.sh: Нет такого файла или каталога

user@XFCE-Mint:~/Рабочий стол/sed$ chmod +x test.sh
user@XFCE-Mint:~/Рабочий стол/sed$ ./test.sh
bash: ./test.sh: /bin/bash^M: неверный интерпретатор: Нет такого файла или каталога

user@XFCE-Mint:~/Рабочий стол/sed$ sh ./test.sh
: Нет такого файла или каталога.xml
: not found3: ./test.sh: 
user@XFCE-Mint:~/Рабочий стол/sed$ 
t42
Level 11
Level 11
Posts: 3744
Joined: Mon Jan 20, 2014 6:48 pm

Re: Не работает скрипт

Post by t42 »

stiks999 wrote: Fri May 29, 2020 7:08 am

Code: Select all

user@XFCE-Mint:~/Рабочий стол/sed$ sh ./test.sh
 : Нет такого файла или каталога.xml
This time it was displayed an error in your script
[Translated by Google: На этот раз отображалась ошибка в вашем скрипте]
Last edited by t42 on Fri May 29, 2020 10:39 am, edited 1 time in total.
-=t42=-
t42
Level 11
Level 11
Posts: 3744
Joined: Mon Jan 20, 2014 6:48 pm

Re: Не работает скрипт

Post by t42 »

No errors for me. This script working fine:

Code: Select all

#!/bin/bash
sed -i '15d;58,61d;14r 1.xml' test1.xml

Code: Select all

$ pwd
/media/ramdisk/test_01
$ ls
1.xml  test1.xml  test.sh
$ cat test.sh
#!/bin/bash
sed -i '15d;58,61d;14r 1.xml' test1.xml
$ ./test.sh
$ 
-=t42=-
stiks999

Re: Не работает скрипт

Post by stiks999 »

Все тесты проводил в виртуальной машине Linux Mint XFCE. Попробовал установить Cinnamon - не работает скрипт.
Попробовал установить Linux Mint XFCE на чистое железо без виртуализации - тоже не работает.
Потом заметил что в файле 1.xml тип разрыва строки - Windows (CR LF), потому что создавал файл под Windows в Notepad++.
Изменил тип на Unix (LF) и все заработало! УРА!!! :D Я очень рад что все получилось!
Спасибо большое t42! Ты заставил меня поверить что этот скрипт точно работает! Спасибо!
t42 wrote: Fri May 29, 2020 8:32 am No errors for me. This script working fine:

Code: Select all

#!/bin/bash
sed -i '15d;58,61d;14r 1.xml' test1.xml
User avatar
root
Level 3
Level 3
Posts: 133
Joined: Wed Mar 13, 2019 11:57 am

Re: Не работает скрипт

Post by root »

Code: Select all

#!/bin/bash
cd "$(dirname "$0")"  # перешли в директорию, если мы запустили скрипт не там, где нужно
sed -i '15d;58,61d;14r 1.xml' test1.xml  # выполнили команды
Естественно, скрипт должен иметь исполняемый бит, как заметили выше
chmod +x полный_или_относительный_путь_до_скрипта

Кроме того,возможно, имеет смысл сделать заготовку типа файла с названием sh.sh, содержимым #!/bin/bash и исполняемым битом; и поместить его по адресу ~/Шаблоны, дабы при правом клике в файловом менеджере и наведении на "создать документ" высвечивался уже готовый шаблон для скриптинга
stiks999

Re: Не работает скрипт

Post by stiks999 »

root wrote: Fri May 29, 2020 10:59 pm

Code: Select all

#!/bin/bash
cd "$(dirname "$0")"  # перешли в директорию, если мы запустили скрипт не там, где нужно
sed -i '15d;58,61d;14r 1.xml' test1.xml  # выполнили команды
Естественно, скрипт должен иметь исполняемый бит, как заметили выше
chmod +x полный_или_относительный_путь_до_скрипта

Кроме того,возможно, имеет смысл сделать заготовку типа файла с названием sh.sh, содержимым #!/bin/bash и исполняемым битом; и поместить его по адресу ~/Шаблоны, дабы при правом клике в файловом менеджере и наведении на "создать документ" высвечивался уже готовый шаблон для скриптинга
Можно подробнее объяснить мне почему обязательно должен быть "исполняемый бит".
Я всегда использовал и администрировал только Windows, теперь решил взяться за Linux, изучаю пару недель и уже успел написать несколько скриптов, которые успешно отработали раз по 20 каждый на виртуальных машинах и на реальных. Ни в одном из них я не использовал в первой строке #!/bin/bash просто запускал терминал в той же папке и выполнял скрипт командой

Code: Select all

sudo sh myscript.sh
Более того, тот скрипт, описанный выше, после изменения типа строки на Unix (LF) прекрасно отрабатывает без #!/bin/bash и без chmod +x
Вопрос - почему обязательно использовать в первой строке #!/bin/bash и chmod +x? Какие преимущества я получу?

P.S. За ~/Шаблоны спасибо, взял на заметку.
User avatar
root
Level 3
Level 3
Posts: 133
Joined: Wed Mar 13, 2019 11:57 am

Re: Не работает скрипт

Post by root »

Потому что исполняемым бит сообщает системе, что файл следует рассматривать как программу. Запуск типа sudo sh myscript.sh никогда не пробовал, но, вероятно, при таком запуске dash воспринял, что от него требуют запустить файл как программу (либо исполняемый бит все же был).

Теперь по поводу отличий. Пара выдержек из гугла:
/bin/sh - Это Bourne Shell версии 1.0
/bin/bash - Это Bourne Shell версии 2.0
Соответственно в баше работает все написанное для /bin/sh. Отличаются они тем, что читают разные файлы при старте. /bin/sh - читает .profile. /bin/bash - читает .bash_profile.
Debian Almquist shell (dash) — командная оболочка UNIX, намного более легковесная, чем bash, при этом POSIX-совместимая. dash занимает очень мало места на диске, но не может похвастаться богатой функциональностью.
Собственно, sh и Dash - одно и то же в системе:

Code: Select all

$ file /bin/sh  # что из себя представляет sh
/bin/sh: symbolic link to dash
$ which dash  # где нах-ся dash
/bin/dash
Более подробно вопрос можно изучить в гугле. Я лишь отмечу, что запускать скрипты каждый раз через устаревший sh, используя команду в терминале, не так удобно и практично, чем сразу в файле указать, где нах-ся интерпретатор, дать исполняемый бит и запускать скрипт уже ни так: sudo sh myscript.sh, а просто вот так: sudo ./myscript.sh ( ./ - обязательно писать, без четкого указания, что этот путь - относителен (когда он таковым является), система начнет искать файл во всяких /bin, /sbin, /usr/bin и т.д.). Хотя дело, конечно, лично каждого.
stiks999

Re: Не работает скрипт

Post by stiks999 »

root cпасибо большое за разъяснения! Я примерно понял, что при использовании sh myscript.sh в более сложных скриптах могут быть проблемы и надо сразу привыкать делать правильно.
Locked

Return to “Русский - Russian”