Ответ
Exit-коды (коды возврата) — это стандартный механизм в Linux для передачи результата выполнения процесса. Я активно использую их в скриптах автоматизации и CI/CD пайплайнах для контроля потока выполнения.
Основные коды и их значение:
- 0: Успешное завершение. Это сигнал для следующей команды в пайплайне (
&&) о том, что можно продолжать. - 1: Общая ошибка или неуспешное завершение (например, сбой в пользовательском скрипте).
- 2: Неправильное использование встроенной команды shell (например, неверный аргумент).
- 126: Команда найдена, но не является исполняемой (проблема с правами
chmod +x). - 127: Команда не найдена (
command not found). - 130 (128+2): Процесс завершен сигналом
SIGINT(обычно Ctrl+C). - 137 (128+9): Процесс принудительно убит сигналом
SIGKILL(kill -9). - 143 (128+15): Процесс корректно завершен сигналом
SIGTERM(стандартный сигналkill).
Практическое использование в скриптах:
#!/bin/bash
# Пример скрипта деплоя с проверкой кодов возврата
echo "Запуск сборки..."
if ! docker build -t myapp:latest .; then
echo "[ERROR] Сборка Docker-образа завершилась с кодом $?. Прерывание."
exit 1 # Возвращаем свой код ошибки для пайплайна
fi
echo "Пуш образа в registry..."
docker push myapp:latest
# Если push упадет, его exit code !=0 прервет скрипт из-за настроенного 'set -e'
echo "[SUCCESS] Все шаги выполнены."
exit 0
В CI/CD (например, GitLab CI) проверка $? позволяет реализовать сложную логику: продолжить при определенных ошибках или остановить пайплайн.
Ответ 18+ 🔞
Э, слушай, давай разжую про эти exit-коды, а то народ часто нихуя не понимает, а это ж основа основ! Представь, что каждая команда в линуксе — это работяга, который, закончив дело, должен тебе крикнуть в спину: «Всё, я сделал!» или «Бля, тут косяк!». Вот этот крик — и есть exit-код, цифра, которую процесс отдаёт системе перед тем, как накрыться медным тазом.
Основные цифры, которые надо знать в лицо:
- 0: Всё заебись, работа сделана. Это священная цифра. Если скрипт видит 0, он такой: «О, красава, можно дальше работать». В пайплайне с
&&это зелёный свет. - 1: Общая ошибка. Что-то пошло не так, но что именно — хрен его знает. Чаще всего это твой собственный скрипт, который упал с криком «ёпта, я не могу!».
- 2: Кривые руки у того, кто команду вызывает. Неправильно использовал встроенную команду шелла, аргументы не те передал. Шелл сам возмущается.
- 126: Нашёл файл, а запустить не может. Классика — забыл сделать
chmod +x. Права, блядь, где права?! - 127: Вообще нихуя не нашёл.
command not foundв чистом виде. Искал-искал — и ушёл в запой. - 130 (128+2): Процессу нажали Ctrl+C. Он вежливо попрощался сигналом
SIGINT. - 137 (128+9): Жестокое убийство. Его пристрелили командой
kill -9(SIGKILL). Сопротивляться бесполезно. - 143 (128+15): Вежливая просьба умереть. Отправили
SIGTERM(простоkill), и процесс согласился.
А теперь, блядь, как это использовать в жизни, чтобы не быть распиздяем:
Вот смотри, реальный скрипт деплоя. Тут без проверок — просто пиздец, а не автоматизация.
#!/bin/bash
# Пример скрипта деплоя с проверкой кодов возврата
echo "Запуск сборки..."
if ! docker build -t myapp:latest .; then
echo "[ERROR] Сборка Docker-образа завершилась с кодом $?. Прерывание."
exit 1 # Возвращаем свой код ошибки для пайплайна
fi
echo "Пуш образа в registry..."
docker push myapp:latest
# Если push упадет, его exit code !=0 прервет скрипт из-за настроенного 'set -e'
echo "[SUCCESS] Все шаги выполнены."
exit 0
Смысл в чём? Если docker build свалится и вернёт любую цифру, кроме нуля, мы это ловим, орем в лог с этим самым кодом ($? — волшебная переменная с кодом последней команды) и сами выходим с кодом 1. Это сигнал для CI/CD системы: «Чувак, тут всё пошло по пизде, дальше не продолжать». А если в начале скрипта стоит set -e, то он сам прервётся на первой же команде с ошибкой, что тоже часто удобно, чтобы не делать кучу проверок.
В общем, exit-коды — это не какая-то академическая хуйня, а реальный инструмент, чтобы твои скрипты не превращались в маньяка, который продолжает деплоить в прод, когда уже всё сломалось на первом шагу. Доверия ебать ноль к слепому выполнению, всегда проверяй, что тебе накричали в спину!