Не могу запустить bash скрипт вылетает ошибка — syntax error near unexpected token `
вот классика
8. Функции
Как почти в любом языке программирования, Вы можете использовать функции для группировки кусков кода более логичным способом или для практического применения волшебного искусства рекурсии.
Объявление функции — это всего лишь запись function my_func < my_code >.
Вызов функции осуществляется точно так же, как и вызов других программ, Вы просто пишете её имя.
8.1 Пример функций
#!/bin/bash function quit < exit >function hello < echo Hello! >hello quit echo foo
Как исправить ошибку bash: syntax error near unexpected token `(‘?
Первую команду разбирать нет желания, разберу вторую, и если хотите, по тому же принципу разбирайте первую, благо идея очень незатейливая.
Подставляем первый $ , предполагается что там будет 1, потому, что это длина кода возврата предыдущей команды. Обычно это код 0 (если не произошло обшики), соответственно его длина 1:
по маске /. /. /. 1. , после поиска по диску, найдется команда /usr/bin/sha1sum , по крайней мере на это рассчитывает скрипт:
: "`/usr/bin/sha1sum>??$:$>
: "de603c91038f329cce1cca8a30ea161b2271e2f6 -";/. /$>??$:$>
команда : «de603c91038f329cce1cca8a30ea161b2271e2f6 -» не делает ничего полезного, но соответствующая строчка осядет в $_ , а код ошибки $? станет равным 0
Поэтому вместо последующих $ подставятся единицы, правда в моей (более ранней) версии bash такая подстановка срабатывает неправильно:
Далее подставляем подстроки переменной $_ : $ берет ее первый символ, т.е. d , а $ — второй, т.е. e
по маске найдется /bin/date
Понимание распространенных сообщений об ошибках в Linux 3 мин для чтения


Добавить в избранное
Главное меню » Linux » Понимание распространенных сообщений об ошибках в Linux

Работа с интерфейсом командной строки Linux временами может вызывать разочарование. Хотя сценарии Bash и shell могут быть мощными, они также могут вызывать разочарование при появлении неожиданных или неясных сообщений об ошибках. В этом посте в блоге мы рассмотрим наиболее распространенные сообщения об ошибках, с которыми вы можете столкнуться, и примеры, которые могут приводить к этим ошибкам.
Частые ошибки команд Linux
Argument list too long
Это сообщение об ошибке появляется, когда список аргументов, переданных команде, превышает максимальную длину, разрешенную системой. Это может произойти, если вы попытаетесь удалить или перечислить все файлы в каталоге с большим количеством файлов и с использованием подстановочного знака bash или просто передадите слишком много аргументов. Кроме того, это может произойти, если вы забудете заключить аргумент, содержащий пробелы, в кавычки, в результате чего Bash интерпретирует его как несколько аргументов.
Максимальное количество аргументов в вашей системе можно оценить с помощью команды, getconf ARG_MAX которая обеспечивает максимальную длину буфера аргументов, передаваемых вызову exec(). Хотя это ненадежный способ определения максимального количества аргументов командной оболочки, смотрите это подробное объяснение. Например, вы можете создать большую тестовую папку, используя цикл командной строки bash for или dd.
Пример цикла Bash (медленный):
$> mkdir test $> for i in <0..$(($(getconf ARG_MAX)/10))>; do touch test/$i; done $> ls test/* bash: ls: Argument list too long
Пример dd (самый быстрый):
$> mkdir test $> dd if=/dev/zero of=test/masterfile bs=1 count=$(($(getconf ARG_MAX)/10)) 104857+0 records in 104857+0 records out 104857 bytes (105 kB, 102 KiB) copied, 0.267711 s, 392 kB/s $> split -b 1 test/masterfile test/ $> ls test/* bash: ls: Argument list too long
Вы столкнетесь с аналогичной проблемой при попытке подсчитать количество файлов в большом каталоге с помощью команды ls. Лучшей альтернативой было бы подсчитать файлы с помощью команд find и wc.
command not found
Это сообщение об ошибке появляется при попытке запустить команду, которая либо не существует, либо не может быть найдена в вашем $PATH. Эта ошибка также может возникнуть, если вы допустите опечатку в имени команды или попытаетесь запустить скрипт, не сделав его сначала исполняемым.
$> foobar foobar: command not found
cannot open display
Это сообщение об ошибке появляется, когда программа пытается открыть окно на вашем заданном порту отображения, но не может подключиться к нему. В первом примере ниже не указана переменная среды $DISPLAY, которая препятствует правильному запуску приложения.
$firefox Importing existing firefox profiles from /home/nicolas/.mozilla/firefox Found default profile: fulzrt75.default Import done in 0.404 s Error: no DISPLAY environment variable specified
В следующем примере дисплей недоступен или не существует, что приводит к сообщению об ошибке cannot open display.
$ firefox Error: cannot open display: 0:0
Читать Как создать файл .CRT в Linux?
Эта ошибка также может возникнуть, если вы пытаетесь запустить программу с графическим интерфейсом из сеанса SSH без включенной переадресации X11, например:
$> ssh user@example.com firefox Error: cannot open display: 0:0
Чтобы решить эту проблему, используйте опцию -X ssh или добавьте ForwardX11 yes в свой ~/.ssh/config. Стороне сервера также необходимо будет разрешить пересылку X11, используя X11Forwarding yes конфигурацию в /etc/ssh/sshd_config.
Connection refused
Это сообщение об ошибке появляется при попытке подключиться к сетевой службе, которая не запущена или не прослушивается на указанном порту.
$> wget localhost:123 --2023-03-28 07:17:18-- http://localhost:123/ Resolving localhost (localhost). 127.0.0.1, ::1 Connecting to localhost (localhost)|127.0.0.1|:123. failed: Connection refused. Connecting to localhost (localhost)|::1|:123. failed: Connection refused.
Каталог и файлы
В разрешении отказано
Это сообщение об ошибке появляется при попытке получить доступ к файлу или каталогу, на доступ к которым у вас нет разрешения. Например, следующая команда пользователя пытается выполнить чтение из файла /etc/shadow, доступного только пользователю root, что приводит к ошибке:
$> cat /etc/shadow cat: /etc/shadow: Permission denied
No such file or directory
Это сообщение об ошибке появляется при попытке доступа к файлу или каталогу, которые не существуют. Например, следующая команда cat пытается выполнить чтение из файла, который не существует:
$> cat test cat: test: No such file or directory
not a directory
Это сообщение об ошибке появляется при попытке доступа к каталогу, который не является каталогом. Например, следующая командная строка пытается изменить текущий путь на файл вместо каталога, что приводит к ошибке:
$> touch test $> cd test cd: not a directory: test
File exists
Это сообщение об ошибке появляется при попытке создать файл или каталог, который уже существует. Например, это произойдет, если вы попытаетесь создать файл или каталог с тем же именем, что и существующий.
$> mkdir test $> mkdir test mkdir: cannot create directory ‘test’: File exists
invalid option
Это сообщение об ошибке появляется, когда вы передаете недопустимый параметр команде. Например, это может произойти, если вы неправильно ввели параметр или используете параметр, не поддерживаемый командой.
$> ls -3 ls: invalid option -- '3' Try 'ls --help' for more information.
Bad file descriptor
Это сообщение об ошибке появляется, когда программа пытается использовать файловый дескриптор, который не открыт. Например, следующая командная строка пытается выполнить чтение из файлового дескриптора, который не был открыт, что приводит к ошибке:
$> read -u 3 var bash: read: 3: invalid file descriptor: Bad file descriptor
Синтаксическая ошибка
Сообщение о синтаксической ошибке часто указывает на проблему с синтаксисом команды или сценария, часто из-за опечатки. Сообщение об ошибке обычно будет содержать больше деталей, таких как неожиданный конец файла или недопустимый арифметический оператор. Вы также можете получить синтаксическую ошибку при неправильном перенаправлении файла или при включении круглых скобок в команду без надлежащего заключения в кавычки.
Читать Как извлечь файлы Tar в определенный каталог в Linux
Отсутствует имя файла:
$> echo "some test" > bash: syntax error near unexpected token `newline'
$> echo 'this (works)' this (works) $> echo this (fail) bash: syntax error near unexpected token `('
unexpected end of file
Это сообщение об ошибке указывает на проблему с синтаксисом команды или сценария. Обычно это происходит, если вы включаете в команду неожиданный символ, такой как символ новой строки. Например, следующий сценарий приведет к ошибке:
#!/bin/bash # script: test.sh if [ $# -eq 0 ] then echo "The variable is zero" fi^M
$ ./test.sh ./test.sh: line 6: syntax error: unexpected end of file
Удаление дополнительного ^M символа решит проблему.
Другой пример — когда вы не завершаете тела однострочной функции bash точкой с запятой:
#!/bin/bash # script: test.sh myfunc () < echo "$@"; exit 1 >if [ $# -eq 0 ] then echo "The variable is zero" fi
$ ./test.sh ./test.sh: line 68: syntax error: unexpected end of file
Замена myfunc () < echo «$@»; exit 1 >на myfunc () < echo «$@»; exit 1; >решила бы проблему, обратите внимание на точку с запятой в конце команды exit.
invalid arithmetic operator
Это сообщение об ошибке появляется при использовании недопустимого арифметического оператора. Например, следующее расширение bash пытается выполнить арифметику с плавающей точкой и считает точку . неподдерживаемым оператором, что приводит к ошибке.
$> echo $((5.3 + 1)) bash: 5.3 + 1: syntax error: invalid arithmetic operator (error token is ".3 + 1")
Частые опечатки
division by 0
Это сообщение об ошибке появляется, когда программа пытается разделить число на ноль. Например, следующее арифметическое расширение Bash пытается разделить 5 на 0, что приводит к ошибке:
$> echo $((5 / 0)) bash: 5 / 0: division by 0 (error token is "0")
ambiguous redirect
Это сообщение об ошибке появляется, когда возникает проблема с перенаправлением в скрипте Bash. Это может произойти, если вы неправильно используете оператор перенаправления. Следующий пример пытается перенаправить echo выходные данные в несуществующую переменную, что приводит к ошибке.
$> echo "a" > $file_name bash: $file_name: ambiguous redirect
По этой причине важно заключать переменные в кавычки. В этом примере указание имени переменной в кавычках привело бы к более значимому сообщению об ошибке, намекая на несуществующий файл или неправильную переменную.
$> echo "a" > "$" bash: : No such file or directory
bad substitution
Это сообщение об ошибке появляется, когда вы используете неправильный или неподдерживаемый синтаксис для замены переменных. В следующих примерах попытка использовать недопустимый синтаксис замены переменных приводит к ошибке:
- Имя переменной со случайными пробелами: bash -c ‘$’
- Опечатка при расширении параметра, например, использование точки с запятой вместо: bash -c ‘$’
- Функция из более поздней версии Bash: например, использование bash 3.2 в macOS с расширением параметров bash -c ‘$’
bash-3.2$ $ $ bash: $: bad substitution
$
Расширение представляет собой либо преобразование значения параметра, либо информацию о самом параметре, в зависимости от значения operator . Каждый оператор состоит из одной буквы:
Q Расширение представляет собой строку, представляющую собой значение параметра, заключенное в кавычки в формате, который может быть повторно использован в качестве входных данных.
Читать Создание бесконечного цикла Bash с помощью примеров сценариев
Другие распространенные сообщения об ошибках
Permission denied (publickey) (Отказано в разрешении)
Это сообщение об ошибке появляется, когда вы пытаетесь подключиться по SSH к удаленному серверу, но сервер отклоняет ваш SSH-ключ. Это может произойти, если ключ не авторизован для использования на сервере или если файл ключа имеет неправильный формат.
Segmentation fault (Ошибка сегментации)
Это сообщение об ошибке указывает на то, что программа попыталась получить доступ к памяти, доступ к которой ей запрещен. Например, это может произойти, если программа попытается прочитать или записать адрес памяти, который не был выделен.
Device not found (Устройство не найдено)
Это сообщение об ошибке появляется при попытке доступа к устройству, которое недоступно. Например, это может произойти при попытке смонтировать диск, который не подключен, или при попытке получить доступ к общему сетевому ресурсу, который недоступен.
Resource temporarily unavailable (Ресурс временно недоступен)
Это сообщение об ошибке появляется, когда системе временно не удается выделить ресурс, такой как память или файловые дескрипторы. Например, это может произойти, если система находится под большой нагрузкой или процесс использует слишком много ресурсов.
Unable to connect to remote host (Не удается подключиться к удаленному хосту)
Эта ошибка возникает, когда системе не удается подключиться к удаленному хосту. Например, это может произойти, если удаленный хост не работает, если возникла проблема с сетевым подключением или если удаленный хост не прослушивает указанный порт.
Out of memory (Не хватает памяти)
Это сообщение об ошибке указывает на то, что системе не хватает памяти и она не может выделить больше памяти вашему процессу. Это может произойти, если вы запускаете программу, для которой требуется много памяти, или если одновременно выполняется несколько программ.
Это всего лишь несколько примеров из множества сообщений об ошибках, с которыми вы можете столкнуться при работе с Bash в Linux. Понимание этих сообщений об ошибках и способов их устранения необходимо для того, чтобы овладеть командной строкой Linux.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Yii Framework
[SOLVED] bash syntax error при попытке создать таблицу миграцией
Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
2 сообщения • Страница 1 из 1
marsden Сообщения: 23 Зарегистрирован: 2019.11.25, 09:28
[SOLVED] bash syntax error при попытке создать таблицу миграцией
Сообщение marsden » 2019.12.24, 09:38
Всем трям.
Голову сломал, в чем прикол.
Вроде все по доке, в командной строке
$ php yii migrate/create create_cfg_sprlist_table --fields=name:string(30):notNull,title:string(30):notNull -bash: syntax error near unexpected token `('
Если убрать скобки, то есть сделать
$ php yii migrate/create create_cfg_sprlist_table --fields=name:string:notNull,title:string:notNull
то все нормально, миграция создается, но требуется правка кода в части подстановки длины полей.
В чем прикол? В документации приводится именно такой случай, с указанием длин строковых полей, может, уже глаз замылен перед НГ и я чего-то туплю?
Линукс, захожу через Putty, если это играет роль ))