Работа с интерфейсом командной строки Linux временами может вызывать разочарование. Хотя сценарии Bash и shell могут быть мощными, они также могут вызывать разочарование при появлении неожиданных или неясных сообщений об ошибках. В этом посте в блоге мы рассмотрим наиболее распространенные сообщения об ошибках, с которыми вы можете столкнуться, и примеры, которые могут приводить к этим ошибкам.
Это сообщение об ошибке появляется, когда список аргументов, переданных команде, превышает максимальную длину, разрешенную системой. Это может произойти, если вы попытаетесь удалить или перечислить все файлы в каталоге с большим количеством файлов и с использованием подстановочного знака 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.
Это сообщение об ошибке появляется при попытке запустить команду, которая либо не существует, либо не может быть найдена в вашем $PATH. Эта ошибка также может возникнуть, если вы допустите опечатку в имени команды или попытаетесь запустить скрипт, не сделав его сначала исполняемым.
$> foobar foobar: command not found
Это сообщение об ошибке появляется, когда программа пытается открыть окно на вашем заданном порту отображения, но не может подключиться к нему. В первом примере ниже не указана переменная среды $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
Эта ошибка также может возникнуть, если вы пытаетесь запустить программу с графическим интерфейсом из сеанса 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.
Это сообщение об ошибке появляется при попытке подключиться к сетевой службе, которая не запущена или не прослушивается на указанном порту.
$> 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
Это сообщение об ошибке появляется при попытке доступа к файлу или каталогу, которые не существуют. Например, следующая команда cat пытается выполнить чтение из файла, который не существует:
$> cat test cat: test: No such file or directory
Это сообщение об ошибке появляется при попытке доступа к каталогу, который не является каталогом. Например, следующая командная строка пытается изменить текущий путь на файл вместо каталога, что приводит к ошибке:
$> touch test $> cd test cd: not a directory: test
Это сообщение об ошибке появляется при попытке создать файл или каталог, который уже существует. Например, это произойдет, если вы попытаетесь создать файл или каталог с тем же именем, что и существующий.
$> mkdir test $> mkdir test mkdir: cannot create directory ‘test’: File exists
Это сообщение об ошибке появляется, когда вы передаете недопустимый параметр команде. Например, это может произойти, если вы неправильно ввели параметр или используете параметр, не поддерживаемый командой.
$> ls -3 ls: invalid option -- '3' Try 'ls --help' for more information.
Это сообщение об ошибке появляется, когда программа пытается использовать файловый дескриптор, который не открыт. Например, следующая командная строка пытается выполнить чтение из файлового дескриптора, который не был открыт, что приводит к ошибке:
$> read -u 3 var bash: read: 3: invalid file descriptor: Bad file descriptor
Сообщение о синтаксической ошибке часто указывает на проблему с синтаксисом команды или сценария, часто из-за опечатки. Сообщение об ошибке обычно будет содержать больше деталей, таких как неожиданный конец файла или недопустимый арифметический оператор. Вы также можете получить синтаксическую ошибку при неправильном перенаправлении файла или при включении круглых скобок в команду без надлежащего заключения в кавычки.
Отсутствует имя файла:
$> echo "some test" > bash: syntax error near unexpected token `newline'
Пропущенные кавычки:
$> echo 'this (works)' this (works) $> echo this (fail) bash: syntax error near unexpected token `('
Это сообщение об ошибке указывает на проблему с синтаксисом команды или сценария. Обычно это происходит, если вы включаете в команду неожиданный символ, такой как символ новой строки. Например, следующий сценарий приведет к ошибке:
#!/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.
Это сообщение об ошибке появляется при использовании недопустимого арифметического оператора. Например, следующее расширение bash пытается выполнить арифметику с плавающей точкой и считает точку . неподдерживаемым оператором, что приводит к ошибке.
$> echo $((5.3 + 1)) bash: 5.3 + 1: syntax error: invalid arithmetic operator (error token is ".3 + 1")
Это сообщение об ошибке появляется, когда программа пытается разделить число на ноль. Например, следующее арифметическое расширение Bash пытается разделить 5 на 0, что приводит к ошибке:
$> echo $((5 / 0)) bash: 5 / 0: division by 0 (error token is "0")
Это сообщение об ошибке появляется, когда возникает проблема с перенаправлением в скрипте Bash. Это может произойти, если вы неправильно используете оператор перенаправления. Следующий пример пытается перенаправить echo выходные данные в несуществующую переменную, что приводит к ошибке.
$> echo "a" > $file_name bash: $file_name: ambiguous redirect
По этой причине важно заключать переменные в кавычки. В этом примере указание имени переменной в кавычках привело бы к более значимому сообщению об ошибке, намекая на несуществующий файл или неправильную переменную.
$> echo "a" > "${file_name}" bash: : No such file or directory
Это сообщение об ошибке появляется, когда вы используете неправильный или неподдерживаемый синтаксис для замены переменных. В следующих примерах попытка использовать недопустимый синтаксис замены переменных приводит к ошибке:
bash-3.2$ ${x@Q} ${x@Q} bash: ${x@Q}: bad substitution
👉 ${параметр@operator}
Расширение представляет собой либо преобразование значения параметра, либо информацию о самом параметре, в зависимости от значения operator . Каждый оператор состоит из одной буквы:
Q Расширение представляет собой строку, представляющую собой значение параметра, заключенное в кавычки в формате, который может быть повторно использован в качестве входных данных.
Это сообщение об ошибке появляется, когда вы пытаетесь подключиться по SSH к удаленному серверу, но сервер отклоняет ваш SSH-ключ. Это может произойти, если ключ не авторизован для использования на сервере или если файл ключа имеет неправильный формат.
Это сообщение об ошибке указывает на то, что программа попыталась получить доступ к памяти, доступ к которой ей запрещен. Например, это может произойти, если программа попытается прочитать или записать адрес памяти, который не был выделен.
Это сообщение об ошибке появляется при попытке доступа к устройству, которое недоступно. Например, это может произойти при попытке смонтировать диск, который не подключен, или при попытке получить доступ к общему сетевому ресурсу, который недоступен.
Это сообщение об ошибке появляется, когда системе временно не удается выделить ресурс, такой как память или файловые дескрипторы. Например, это может произойти, если система находится под большой нагрузкой или процесс использует слишком много ресурсов.
Эта ошибка возникает, когда системе не удается подключиться к удаленному хосту. Например, это может произойти, если удаленный хост не работает, если возникла проблема с сетевым подключением или если удаленный хост не прослушивает указанный порт.
Это сообщение об ошибке указывает на то, что системе не хватает памяти и она не может выделить больше памяти вашему процессу. Это может произойти, если вы запускаете программу, для которой требуется много памяти, или если одновременно выполняется несколько программ.
Это всего лишь несколько примеров из множества сообщений об ошибках, с которыми вы можете столкнуться при работе с Bash в Linux. Понимание этих сообщений об ошибках и способов их устранения необходимо для того, чтобы овладеть командной строкой Linux.