Сценарій оболонки не вдається: Синтаксична помилка: "(" несподівано)


64

Я працював над сценарієм, який автоматизує налаштування середовища розробки для програми Raspberry Pi (покрокові деталі, які працюють тут ). Сценарій пов'язаний у цій статті, але для зручності ви також можете їх знайти тут . Тепер при запуску цього сценарію встановіть і налаштуйте середовище без помилок, але вам доведеться вводити свій пароль sudo не один раз через значення часу вимкнення sudo за замовчуванням. Тому я почав експериментувати, видаливши всі рядки sudo і запустивши весь скрипт через sudo в командному рядку так:

kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh

Це працює добре, як очікувалося, і проходить більшу частину шляху до цього моменту:

./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected

Тепер цей рядок працював чудово раніше, коли не запускався весь сценарій із судо. Ніщо про цю лінію не працює як судо, що повинно зупинити її роботу, наскільки мені відомо, хтось має ідеї?


1
Шебанг насправді в рядку 9? Завдяки спорідненості Ubuntu DashAsBinSh, я підозрюю, що ваш сценарій інтерпретується dashзамість bash. Спробуйте перенести
шебанг

Відповідно до цієї статті виклик / bin / bash безпосередньо замість / bin / sh буде; правильно використовувати bash замість тире, так що це не повинно бути проблемою, як я це розумію. Я все ще можу перемістити шебанг, але це насправді не пояснює, чому він працює, коли ти не судо весь сценарій.
kemra102

У моєму випадку все було добре, але, як звичка, я запускав свій скрипт оболонки з "ш", а не з "баш".
Індраджет Гур

Відповіді:


82

Сценарій не починається з рядка shebang , тому система виконує його /bin/sh. На Ubuntu - /bin/shце тире , оболонка, розроблена для швидкого запуску та виконання з лише стандартними функціями. Коли тире доходить до рядка 68, він бачить синтаксичну помилку: ці дужки нічого не означають для нього в контексті.

Оскільки тире (як і всі інші оболонки) є перекладачем, він не скаржиться, поки виконання не досягне проблемної лінії. Тож навіть якщо сценарій успішно запустився в якийсь момент вашого тестування, він би перервав, як тільки буде досягнуто рядок 68.

Рядок shebang повинен бути найпершим у файлі. Оскільки ви використовуєте функції bash, першим рядком файлу має бути #!/bin/bashабо #!/usr/bin/env bash.


2
Завдяки чіткому розриву в моїх знаннях, я не дуже сценарію, тому не знав про це! Дякуємо за пояснення, що це дуже допомогло, і це буде дуже корисно знати і в майбутньому.
kemra102

Дозвольте додати, що ця помилка виникає навіть при використанні розширення скриптів для nautilus. Додавання лінії shebang вирішило її негайно. +1.
Бхавін Доші

Зіткнувшись з проблемою, запущеною sonarqube.shна Ubuntu 15.10. Як сказано, змінив заголовок. Виконання sudo sh ./sonar.sh console. Помилка отримується.
soufrk

@soufrk Це sonarqube.shчи sonar.sh? Приведи мозок у порядок. І в будь-якому випадку, якщо ви не зможете вирішити проблему з інформацією в цій темі, задайте нове запитання з повним вмістом сценарію та скопіюйте та вставте повідомлення (повідомлення) про повну помилку.
Жиль

Моє ліжко !! Неправильно виконується арка. Але що цікаво, на правильній арці файл, що починається з #! /bin/shвиконаного ідеально. Тепер це мене здивувало.
soufrk

6

Якщо шебанг не знаходиться в першому рядку, він не буде дотримуватися, незалежно від оболонки кореневого користувача, SHELLзмінної чи -sпрапора. Ви можете легко підтвердити це простим прикладом:

#
#!/bin/bash
offfset=(`ls`)
echo $offset

Запуск цього сценарію за допомогою sudo призведе до синтаксичної помилки в останніх версіях Ubuntu та Debian.

У вас є два варіанти, щоб переконатися, що сценарій трактується bash:

  1. Перемістіть шебанг до першого рядка

  2. Бігайте sudoтак:

    sudo bash ./pi_dev_env_install.sh

1

Для мене починаючи сценарій з:

bash ./< script file > 

працює чудово.


Це може бути правдою для вас, але це насправді не вирішення заявленої проблеми.
bu5hman


0

Спробуйте dos2unix у файлі сценарію. Іноді в джерелі є якісь приховані символи.

команда:

dos2unix script_file.sh script_file.sh

0

Це може статися, якщо ви перекриєте призначеного перекладача. Наприклад, це буде працювати зі sh незалежно від того, який хеш-баг використовується (зручно, коли не використовується хеш-баг):

> sh run.sh

АБО запустити bash:

> bash run.sh

Щоб дозволити йому використовувати визначене скриптом значення хеш-бангу, використовуйте це:

> ./run.sh

-1
sudo chmod 755 <script>

У моєму випадку помилка полягала у відсутності дозволів на виконання файлу. Повідомлення про помилку отримало лише тоді, коли я розділив команди:

$ sudo sh
# ./install

Відсутність дозволів не спричинить це повідомлення про помилку.
Жиль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.