Код возврата последней команды Linux

Обновлено: 21.11.2024

Что такое статус выхода Bash для последней команды?

Если вы работаете с различными сценариями для целей автоматизации и мониторинга, некоторые важные команды сценариев bash помогут повысить вашу производительность. Статус последней команды Bash — очень важная команда для скриптеров bash.

Здесь вы узнаете:

  • какой статус выхода последней команды из bash
  • как использовать код выхода в сценарии оболочки и как его установить
  • когда DiskInternals может вам помочь

Вы готовы? Давайте читать!

Код выхода последней запущенной команды

Каждая команда Linux, которую вы запускаете в оболочке, должна возвращать статус выхода. Обычно статус выхода представляется целым числом, где 0 означает, что скрипт/команда отработали успешно, без ошибок. Любое другое число, кроме нуля (0), означает, что в скрипте или команде произошла ошибка.

Код выхода или код возврата важен, потому что он помогает определить, можно ли в дальнейшем использовать скрипт или команду для других целей. Если код выхода не задан, код выхода является кодом выхода последней выполненной команды.

Чтобы получить код завершения команды

Если вы хотите получить результат bash последней команды, вы должны ввести $? переменная после команды «echo». Кроме того, вы можете использовать команду printf:

Пример:

Результат bash последней команды

Если код не работает должным образом, код выхода будет равен 1 или любому другому числу от 1 до 254.

Использование кода выхода в сценарии оболочки

Вы видели, как получить код выхода сценариев оболочки. Теперь давайте посмотрим, как вы можете использовать код выхода внутри скрипта. Вы можете использовать $? специальная переменная внутри сценария оболочки для проверки статуса выхода.

Код выхода внутри скрипта

Из приведенного выше сценария, если код выхода равен 0, сценарий будет отображать успешное сообщение, но если код выхода представляет собой любое другое число, сценарий будет отображать сообщение об ошибке.

Результат:

Скрипт с эхо-сообщением об ошибке

Установите код выхода

Если вы хотите установить код выхода в скрипте, вот как это сделать. Однако следует помнить, что команда выхода может привести к нормальному завершению сценария оболочки.

Пример синтаксиса:

Синтаксис bash-скрипта последней команды

Пример: test.sh

Пример использования кода выхода

Здесь код выхода определен как 1.

Результат:

Результат использования кода выхода

Если вы хотите открывать файлы Linux в Windows

Итак, вы загрузились в Windows на своем ПК с двойной загрузкой, и вам нужно получить доступ к некоторым файлам, сохраненным в разделе Linux. Что вы должны сделать? DiskInternals Linux Reader — интуитивно понятное программное приложение, которое поможет вам. Он предоставляет вам доступ к файлам в Ext2/3/4, ReiserFS, Reiser4, HFS, HFS+, FAT, exFAT. DiskInternals Linux Reader можно загрузить и использовать бесплатно. Кроме того, он имеет удобный интерфейс. Кроме того, это программное обеспечение работает для пользователей виртуальных машин и очень эффективно для открытия файлов Linux в Windows.

Linux Reader — это окно установки DiskInternals Linux Reader — выберите нужный диск DiskInternals Linux Reader — нужный вам диск открыт DiskInternals Linux Reader — вы можете просматривать файлы

Если вы когда-нибудь задумывались, что такое код выхода или почему он равен 0, 1, 2 или даже 255, вы обратились по адресу.

Опубликовано: 4 февраля 2020 г. | Кен Хесс (Red Hat)

Дополнительные ресурсы по Linux

Когда вы выполняете команду или скрипт, вы получаете код выхода. Код выхода — это системный ответ, сообщающий об успешном выполнении, ошибке или другом условии, который дает представление о том, что вызвало неожиданный результат вашей команды или сценария. Тем не менее, вы можете никогда не узнать о коде, потому что код выхода не раскрывается, пока кто-то не попросит его сделать это. Программисты используют коды выхода для отладки своего кода.

Примечание. Вы часто будете видеть, что код выхода упоминается как статус выхода или даже как коды статуса выхода. Термины взаимозаменяемы, за исключением документации. Надеюсь, мое использование этих двух терминов будет вам понятно.

Я не программист. Мне трудно это признать, но это правда. Я изучал BASIC, FORTRAN и несколько других языков как формально, так и неформально, и должен сказать, что я определенно не программист. Да, конечно, я умею писать сценарии и немного программировать на PHP, Perl, Bash и даже PowerShell (да, я также являюсь администратором Windows), но я никогда не мог зарабатывать на жизнь программированием, потому что я слишком медленно пишу код. и метод проб и ошибок не является эффективной стратегией отладки. На самом деле это печально, но я достаточно компетентен в копировании и адаптации найденного кода, чтобы выполнять необходимые задачи. И все же я также использую коды выхода, чтобы понять, в чем заключаются мои проблемы и почему что-то идет не так.

Коды выхода в некоторой степени полезны, но они также могут быть нечеткими. Например, код выхода 1 — это общая корзина для различных ошибок, которая совершенно бесполезна. В этой статье я объясню несколько зарезервированных кодов ошибок, как они могут возникнуть и как их использовать, чтобы выяснить, в чем проблема. Зарезервированный код ошибки используется Bash, и вам не следует создавать собственные коды ошибок, конфликтующие с ним.

Достаточно предыстории. Пришло время рассмотреть примеры того, что генерирует коды/статусы ошибок.

Извлечение неуловимого кода выхода

Чтобы отобразить код выхода для последней команды, которую вы выполнили в командной строке, используйте следующую команду:

Отображаемый ответ не содержит помпезности или обстоятельств. Это просто число. Вы также можете получить сообщение об ошибке оболочки от Bash с дальнейшим описанием ошибки, но код выхода и ошибка оболочки вместе должны помочь вам понять, что пошло не так.

Выйти из статуса 0

Вообще говоря, статус выхода 0 — это наилучший возможный сценарий. Он сообщает вам, что ваша последняя команда или сценарий успешно выполнены. Успех относителен, потому что код выхода только информирует вас о том, что сценарий или команда выполнены нормально, но код выхода не сообщает вам, имеет ли информация из него какую-либо ценность. Примеры лучше иллюстрируют то, что я описываю.

Например, список файлов в вашем домашнем каталоге. У меня в домашнем каталоге нет ничего, кроме скрытых файлов и каталогов, поэтому здесь не на что смотреть, но код выхода не заботится ни о чем, кроме успеха выполнения команды:

Код выхода 0 означает, что команда ls выполнена без проблем. Хотя, опять же, информация из кода выхода не представляет для меня реальной ценности.

Теперь выполните команду ls в каталоге /etc, а затем отобразите код выхода:

Вы можете видеть, что любое успешное выполнение приводит к коду выхода 0, включая что-то совершенно неправильное, например, выполнение команды cat для двоичного исполняемого файла, такого как команда ls:

Выйти из статуса 1

Используя приведенный выше пример, но добавив длинный список и рекурсивные параметры ( -lR ), вы получите новый код выхода 1:

Хотя вывод команды выглядит так, как будто все прошло хорошо, если вы прокрутите вверх, вы увидите в списке несколько ошибок "Отказано в доступе". Эти ошибки приводят к состоянию выхода 1, что описывается как «недопустимые операции». Хотя вы можете ожидать, что ошибка "Отказано в доступе" приведет к статусу выхода 1, вы ошибаетесь, как вы увидите в следующем разделе.

Однако деление на ноль дает вам статус выхода 1. Вы также получаете сообщение об ошибке от оболочки, уведомляющее вас о том, что выполняемая вами операция является «недопустимой»:

Без ошибки оболочки статус выхода 1 не очень полезен, как видно из первого примера. Во втором примере вы знаете, почему вы получили ошибку, потому что Bash сообщает вам сообщение об ошибке оболочки. Как правило, когда вы получаете статус выхода 1, ищите недопустимые операции (сообщения Отказано в доступе), смешанные с вашими успехами (например, перечисление всех файлов в каталоге /etc , как в первом примере в этот раздел).

Выйти из статуса 2

Как указано выше, предупреждение оболочки "Отказано в доступе" приводит к статусу выхода 2, а не 1.Чтобы убедиться в этом, попробуйте перечислить файлы в /root :

Статус выхода 2 появляется, когда возникают проблемы с разрешениями или отсутствует ключевое слово в команде или сценарии. Пример отсутствующего ключевого слова — забыть добавить done в цикл выполнения скрипта. Лучший способ отладки сценария с этим статусом выхода — выполнить команду в интерактивной оболочке, чтобы просмотреть полученные ошибки. Этот метод обычно позволяет выявить проблему.

Проблемы с правами доступа немного легче расшифровать и отладить, чем другие типы проблем. Единственное, что означает "Отказано в доступе", это то, что ваша команда или сценарий пытается нарушить ограничение разрешений.

Выйти из статуса 126

Статус выхода 126 — интересный код ошибки прав доступа. Самый простой способ продемонстрировать появление этого кода — создать файл сценария и забыть дать этому файлу разрешение на выполнение. Вот результат:

Эта проблема с разрешением связана не с доступом, а с настройкой, как в режиме. Чтобы избавиться от этой ошибки и вместо этого получить статус выхода 0, введите chmod +x blah.sh .

Примечание. Вы получите статус выхода 0, даже если исполняемый файл не имеет содержимого. Как было сказано ранее, «успех» можно интерпретировать по-разному.

Я получаю статус выхода 126. Этот код фактически говорит мне, что не так, в отличие от более расплывчатых кодов.

Выйти из статуса 127

Состояние выхода 127 говорит о том, что произошло одно из двух: либо команда не существует, либо ее нет в вашем пути ( $PATH ). Этот код также появляется, если вы пытаетесь выполнить команду, которая находится в вашем текущем рабочем каталоге. Например, скрипт выше, которому вы дали разрешение на выполнение, находится в вашем текущем каталоге, но вы пытаетесь запустить скрипт, не указав, где он находится:

Если этот результат возникает в скрипте, попробуйте добавить явный путь к исполняемому файлу или скрипту, вызывающему проблему. Правописание также учитывается при указании исполняемого файла или сценария.

Выйти из статуса 128

Используя код выхода 261, создайте статус выхода 5:

Чтобы создать ошибочный статус выхода 0:

Если вы используете 257 в качестве кода выхода, ваш статус выхода будет равен 1 и т. д. Если код выхода — отрицательное число, результирующий статус выхода — это число, вычтенное из 256. Таким образом, если код выхода равен 20, тогда статус выхода — 236.

Тревожно, не правда ли? Решение, на мой взгляд, состоит в том, чтобы избегать использования кодов выхода, которые зарезервированы и находятся вне допустимого диапазона. Правильный диапазон: 0–255.

Выйти из статуса 130

Если вы запускаете программу или скрипт и нажимаете Ctrl-C, чтобы остановить его, ваш статус выхода равен 130. Этот статус легко продемонстрировать. Введите ls -lR / и сразу же нажмите Ctrl-C:

Больше нечего сказать об этом. Это не очень полезный статус выхода, но вот он для справки.

Выйти из статуса 255

Этот окончательный зарезервированный статус выхода легко создать, но сложно интерпретировать. В документации, которую я нашел, говорится, что вы получаете статус выхода 255, если используете код выхода, выходящий за пределы диапазона 0–255.

Я обнаружил, что этот статус можно получить и другими способами. Вот один пример:

Некоторые независимые авторитетные источники утверждают, что 255 – это общий код ошибки сбоя. Я не могу ни подтвердить, ни опровергнуть это утверждение. Я знаю только, что могу получить статус выхода 255, выполнив определенные команды без параметров.

Подведение итогов

Вот и все: обзор зарезервированных номеров статусов выхода, их значений и способов их создания. Мой личный совет — всегда проверять разрешения и пути для всего, что вы запускаете, особенно в сценарии, вместо того, чтобы полагаться на коды состояния выхода. Мой метод отладки заключается в том, что когда команда в сценарии работает неправильно, я запускаю команду отдельно в интерактивной оболочке. Этот метод работает намного лучше, чем причудливые тактики с прорывами и выходами. Я иду по этому пути, потому что (в большинстве случаев) мои ошибки связаны с разрешениями, поэтому меня научили начинать с этого.

Развлекайтесь, проверяя свои статусы, а теперь мне пора выходить.

[ Хотите попробовать Red Hat Enterprise Linux? Скачайте сейчас бесплатно. ]

Учебник по использованию кодов выхода из команд Linux или UNIX. Примеры того, как получить код выхода команды, как установить код выхода и как подавить коды выхода.

Приблизительное время чтения: 3 минуты

Оглавление

Что такое код выхода в оболочке UNIX или Linux?

Код выхода, иногда называемый кодом возврата, – это код, возвращаемый родительскому процессу исполняемым файлом. В системах POSIX стандартный код выхода — 0 для успеха и любое число от 1 до 255 для всего остального.

Коды выхода могут интерпретироваться машинными сценариями для адаптации в случае успеха или неудачи.Если коды выхода не установлены, код выхода будет кодом выхода последней выполненной команды.

Как получить код завершения команды

Чтобы получить код завершения команды, введите echo $? в командной строке. В следующем примере файл выводится на терминал с помощью команды cat.

Команда выполнена успешно. Файл существует и нет ошибок при чтении файла или его записи на терминал. Таким образом, код выхода равен 0 .

В следующем примере файл не существует.

Код выхода – 1, так как операция не удалась.

Как использовать коды выхода в скриптах

Чтобы использовать коды выхода в сценариях, можно использовать оператор if, чтобы узнать, была ли операция успешной.

Если команда выполнена успешно, код выхода будет равен 0, а на терминал будет выведено сообщение «Сценарий выполнен успешно».

Как установить код выхода

Чтобы установить код выхода в скрипте, используйте код выхода 0, где 0 – число, которое вы хотите вернуть. В следующем примере сценарий оболочки завершается с ошибкой 1 . Этот файл сохраняется как exit.sh .

Выполнение этого скрипта показывает, что код выхода установлен правильно.

Какой код выхода следует использовать?

  • 1 – Общие ошибки.
  • 2 – Неправильное использование встроенных функций оболочки (согласно документации Bash)
  • 126 – Вызванная команда не может быть выполнена
  • 127 – "команда не найдена"
  • 128 – Неверный аргумент для выхода.
  • 128+n — сигнал фатальной ошибки "n"
  • 130 — Сценарий прерван нажатием Control-C
  • 255\* – статус выхода вне диапазона

Как подавить статус выхода

Иногда может потребоваться скрыть статус выхода. Может случиться так, что команда запускается в другом скрипте, и любое состояние, отличное от 0, нежелательно.

В следующем примере файл выводится на терминал с помощью команды cat. Этот файл не существует, поэтому статус выхода будет равен 1 .

Чтобы скрыть сообщение об ошибке, любой вывод стандартной ошибки отправляется в /dev/null с помощью 2>/dev/null .

Если команда cat не удалась, можно использовать операцию ИЛИ, чтобы обеспечить запасной вариант - cat file.txt || выход 0 . В этом случае возвращается код выхода 0, даже если есть ошибка.

Сочетая подавление вывода ошибок и операцию ИЛИ, следующий сценарий возвращает код состояния 0 без вывода, даже если файл не существует.

Дополнительная литература

У вас есть новости или предложения по этой статье? Вы можете отредактировать его здесь и отправить мне запрос на вытягивание.

Последние публикации

Об авторе

Джордж Орнбо живет в Великобритании.

Он увлекается людьми, музыкой, едой и писательством. В предыдущей версии себя он писал книги по технологиям.

«$?» это переменная, которая содержит возвращаемое значение последней выполненной команды. «Эхо $?» отображает 0, если последняя команда была успешно выполнена, и отображает ненулевое значение, если произошла какая-либо ошибка. Баш устанавливает «$?» В статус выхода последнего выполненного процесса. По соглашению 0 означает успешный выход, а ненулевое значение указывает на какую-то ошибку. Его можно использовать для проверки того, была ли предыдущая команда выполнена без ошибок. Если он выполнился успешно, он сохраняет 0. «$?» также полезен в сценариях оболочки как способ решить, что делать в зависимости от того, как работала последняя выполненная команда, проверяя статус выхода.

Работа с «$?» оператор

<р>1. Его значение по умолчанию равно 0, когда система запускается, а команда еще не выполнена. Даже если последняя команда не была успешно выполнена и система перезагружается, мы получаем ее значение равное 0 при вводе следующей команды в терминал.

<р>2. Он возвращает статус выхода последней выполненной команды. В приведенном ниже примере в UNIX нет команды eccho, поэтому последний процесс не был успешно выполнен. Итак, $? хранит ненулевое значение, которое является статусом выхода последней выполненной команды.

<р>3. В приведенном ниже примере, если файл существует (может быть как каталогом, так и файлом), то значение, возвращаемое командой «ls», будет равно 0 (т. е. команда была успешно выполнена), в противном случае будет отображаться число, которое ненулевой. Количество зависит от программы. Ссылаясь на изображение ниже, учтите, что по умолчанию «файл» не существует, тогда $? сохраняет возвращаемое значение 2 (команда не была успешно выполнена), но после создания с помощью touch отображает 0, так как команда ls возвращает 0, поскольку файл существует.

<р>4.Кроме того, когда мы вводим простые значения true и false в терминале, он отображает 0, поскольку true ничего не делает, а завершает работу с кодом состояния 0. Но если мы указываем false, то 1 будет напечатано как ложные выходы с кодом состояния 1.

Читайте также: