Каждая команда Linux или Unix возвращает статус, когда она завершается нормально или ненормально. Вы можете использовать значение статуса выхода в сценарии командного интерпретатора для отображения сообщения об ошибке или запуска команд. Например, если команда tar завершилась неудачно, она возвращает код, который указывает сценарию оболочки отправить электронное письмо сисадминам.
Подробнее о кодах состояния выхода из оболочки Linux bash
- Каждая команда Linux или Unix, выполняемая сценарием оболочки или пользователем, имеет статус выхода.
- Статус выхода - это целое число.
- Для целей оболочки bash команда, которая завершается с нулевым (0) статусом выхода, была успешной.
- Ненулевой (1-255) статус выхода означает неудачу.
- Если команда не найдена, дочерний процесс, созданный для ее выполнения, возвращает статус 127. Если команда найдена, но не может быть выполнена, статус возврата равен 126.
- Все встроенные модули Bash возвращают нулевой статус выхода в случае успеха и ненулевой статус в случае неудачи.
Как отобразить статус выхода из команды shell?
Вы можете использовать специальную переменную оболочки под названием $? для получения статуса выхода ранее выполненной команды. Для вывода переменной $? используйте команду echo/printf. Синтаксис следующий:
1 2 | command echo $? |
Или
1 2 3 4 5 6 7 8 9 10 | /path/to/script.sh command date echo $? ## ИЛИ используйте команду printf ## printf "%d\n" $? ## выполните команду "не-существование" ## foobar13535 ## отображение кода состояния ## echo $? |
Как сохранить статус выхода из команды в переменной оболочки
Присвойте $? переменной оболочки. Синтаксис следующий:
1 2 3 | date status=$? echo "Статус выхода команды date : ${status}" |
Состояние выхода из Linux и конструкции условного доступа/списка
Простой сценарий оболочки для определения имени хоста
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #!/bin/bash # set var FILE="/etc/hosts" # получить имя хоста read -p "Введите имя хоста : " hostname # попытаться найти имя хоста/имя компьютера вn $FILE grep -q -w "${hostname}" "${FILE}" # сохраните статус выхода grep # если grep найден, он вернет 0 статус выхода # если не найден, grep вернет ненулевой статус выхода status=$? if test $status -eq 0 then echo "Host '$hostname' найден в $FILE file." else echo "Host '$hostname' не найден в $FILE file." fi |
Как использовать операторы && и || с кодами выхода
Синтаксис следующий:
1 2 3 | command && echo "success" command || echo "failed" command && echo "success" || echo "failed" |
Если каталог с именем "/tmp/foo" не найден, создайте его:
1 | [ ! -d "/tmp/foo" ] && mkdir -p "/tmp/foo" |
Например, покажите синтаксис использования, когда имя файла не передается в качестве аргумента командной строки:
1 2 3 4 5 6 | #!/bin/Bash _files="$@" ## отказоустойчивость ## [[ "$_files" == "" ]] && { echo "Использование: $0 file1.png file2.png"; exit 1; } ## продолжим ## |
Список общих кодов выхода для GNU/Linux
Код | Описание |
0 | Успех |
1 | Операция не разрешена |
2 | Нет такого файла или каталога |
3 | Нет такого процесса |
4 | Прерванный системный вызов |
5 | Ошибка ввода/вывода |
6 | Нет такого устройства или адреса |
7 | Слишком длинный список аргументов |
8 | Ошибка формата выполнения |
9 | Плохой дескриптор файла |
10 | Нет дочерних процессов |
11 | Ресурс временно недоступен |
12 | Невозможно выделить память |
13 | Отказано в разрешении |
14 | Плохой адрес |
15 | Требуется блокирующее устройство |
16 | Устройство или ресурс заняты |
17 | Файл существует |
18 | Недопустимая межустройственная связь |
19 | Нет такого устройства |
20 | Не каталог |
21 | Является каталогом |
22 | Неверный аргумент |
23 | Слишком много открытых файлов в системе |
24 | Слишком много открытых файлов |
25 | Неподходящий ioctl для устройства |
26 | Текстовый файл занят |
27 | Слишком большой файл |
28 | На устройстве не осталось свободного места |
29 | Неправильный поиск |
30 | Файловая система только для чтения |
31 | Слишком много ссылок |
32 | Сломанная труба |
33 | Числовой аргумент вне области |
34 | Числовой результат вне диапазона |
35 | Предотвращение блокировки ресурсов |
36 | Слишком длинное имя файла |
37 | Нет доступных блокировок |
38 | Функция не реализована |
39 | Каталог не пуст |
40 | Слишком много уровней символических ссылок |
42 | Нет сообщения нужного типа |
43 | Идентификатор удален |
44 | Номер канала вне диапазона |
45 | Уровень 2 не синхронизирован |
46 | Уровень 3 остановлен |
47 | Уровень 3 сброшен |
48 | Номер канала вне диапазона |
49 | Драйвер протокола не подключен |
50 | Отсутствует структура CSI |
51 | Уровень 2 остановлен |
52 | Неверный обмен |
53 | Неверный дескриптор запроса |
54 | Обмен переполнен |
55 | Нет анода |
56 | Неверный код запроса |
57 | Неверный слот |
59 | Плохой формат файла шрифта |
60 | Устройство не является потоком |
61 | Нет доступных данных |
62 | Таймер истек |
63 | Закончились ресурсы потоков |
64 | Машина не находится в сети |
65 | Пакет не установлен |
66 | Объект удален |
67 | Связь разорвана |
68 | Ошибка рекламы |
69 | Ошибка Srmount |
70 | Ошибка связи при отправке |
71 | Ошибка протокола |
72 | Попытка мультихопа |
73 | Специфическая ошибка RFS |
74 | Плохое сообщение |
75 | Значение слишком велико для определенного типа данных |
76 | Имя не уникально в сети |
77 | Дескриптор файла в плохом состоянии |
78 | Удаленный адрес изменен |
79 | Не удается получить доступ к необходимой общей библиотеке |
80 | Доступ к поврежденной общей библиотеке |
81 | Секция .lib в файле a.out повреждена |
82 | Попытка подключить слишком много общих библиотек |
83 | Невозможно выполнить общую библиотеку напрямую |
84 | Неверный или неполный многобайтовый или широкий символ |
85 | Прерванный системный вызов должен быть перезапущен |
86 | Ошибка потоковой трубы |
87 | Слишком много пользователей |
88 | Сокетная операция на не сокете |
89 | Требуется адрес назначения |
90 | Слишком длинное сообщение |
91 | Протокол неправильного типа для сокета |
92 | Протокол недоступен |
93 | Протокол не поддерживается |
94 | Тип сокета не поддерживается |
95 | Операция не поддерживается |
96 | Семейство протоколов не поддерживается |
97 | Семейство адресов не поддерживается протоколом |
98 | Адрес уже используется |
99 | Невозможно назначить запрашиваемый адрес |
100 | Сеть не работает |
101 | Сеть недоступна |
102 | Сеть разорвала соединение при перезагрузке |
103 | Программное обеспечение вызвало прерывание соединения |
104 | Соединение сброшено сверстником |
105 | Нет доступного буферного пространства |
106 | Транспортная конечная точка уже подключена |
107 | Транспортная конечная точка не подключена |
108 | Невозможно отправить после отключения транспортной конечной точки |
109 | Слишком много ссылок |
110 | Соединение прервано по таймеру |
111 | Отказ в подключении |
112 | Хост не работает |
113 | Нет маршрута к хосту |
114 | Операция уже выполняется |
115 | Операция находится в процессе выполнения |
116 | Несвежий файловый хэндл |
117 | Структура нуждается в очистке |
118 | Не файл именованного типа XENIX |
119 | Нет доступных семафоров XENIX |
120 | Является файлом именованного типа |
121 | Ошибка удаленного ввода/вывода |
122 | Превышена дисковая квота |
123 | Не найден носитель |
125 | Операция отменена |
126 | Необходимый ключ недоступен |
127 | Срок действия ключа истек |
128 | Ключ был отозван |
129 | Ключ был отклонен службой |
130 | Владелец умер |
131 | Состояние не может быть восстановлено |
132 | Операция невозможна из-за радиопомех |
133 | Страница памяти имеет аппаратную ошибку |
Команда perror объясняет коды ошибок, которые являются частью пакета MySQL/MariaDB:
1 2 | perror 0 perror 1 |
Заключение
Эта страница объяснила статус выхода bash и связанные с ним команды. Для получения дополнительной информации смотрите man-страницу оболочки bash здесь.