Сбой сценария оболочки: Синтаксическая ошибка: «(» неожиданно


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

Теперь эта строка работала нормально, когда не запускался весь скрипт с sudo. Насколько мне известно, в этой строке, выполняющей роль sudo, нет ничего, что могло бы помешать ее работе. У кого-нибудь есть идеи?


1
Шебанг действительно в строке 9? Из-за близости Ubuntu к DashAsBinSh, я подозреваю, что ваш скрипт интерпретируется dashвместо bash. Попробуйте переместить Шебанг в строке 1.
Манатворк

Согласно этой статье вызов / bin / bash напрямую вместо / bin / sh будет; правильно используйте bash вместо dash, чтобы не было проблем, насколько я понимаю. Конечно, я все еще могу переместить Шебанг, но это не объясняет, почему он работает, когда вы не выполняете весь сценарий.
kemra102

В моем случае все было хорошо, но по привычке я запускал сценарий оболочки с "sh", а не с "bash".
Индраджит Гур

Ответы:


82

Сценарий не начинается со строки Шебанга , поэтому система выполняет его /bin/sh. В Ubuntu /bin/sh- это dash , оболочка, предназначенная для быстрого запуска и запуска с использованием только стандартных функций. Когда тире достигает строки 68, он видит синтаксическую ошибку: эта скобка ничего не значит для него в контексте.

Поскольку дефис (как и все другие оболочки) является интерпретатором, он не будет жаловаться, пока выполнение не достигнет проблемной черты. Таким образом, даже если сценарий успешно запустится в какой-то момент вашего тестирования, он будет прерван, как только будет достигнута строка 68.

Строка Шебанга должна быть самой первой вещью в файле. Так как вы используете функции bash, первая строка файла должна быть #!/bin/bashили #!/usr/bin/env bash.


2
Спасибо за пробел в моих знаниях, я не очень много пишу, поэтому не знал об этом! Спасибо за объяснение, это очень помогло и будет очень полезно знать в будущем.
kemra102

Позвольте мне добавить, что эта ошибка возникает даже при использовании расширения скриптов для nautilus. Добавление линии Шебанга решило это немедленно. +1.
Бхавин Доши

Решение проблемы с sonarqube.shUbuntu 15.10. Изменил заголовок как сказано. Выполнение sudo sh ./sonar.sh console. Все еще получаю ошибку.
soufrk

@ Soufrk Это sonarqube.shили sonar.sh? Прими решение. И в любом случае, если вы не можете решить проблему с информацией в этой теме, задайте новый вопрос с полным содержанием скрипта и скопируйте и вставьте полный текст сообщения об ошибке.
Жиль "ТАК - перестань быть злым"

Виноват !! Был запущен неверный исполняемый файл Arch. Но что интересно, на правильной арке файл, начинающийся с #! /bin/shотлично выполненного. Теперь, это оставляет меня озадаченным.
Soufrk

6

Если шебанг находится не в первой строке, он не будет соблюден, независимо от оболочки пользователя root, 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

Может быть, у вас есть "(" в директории или имени файла.


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.