Exit status codes in linux

What is Exit Status Code ($?) of Last Command in Linux

The “ $? ” is a built-in variable that your shell uses to store the exit status code of the last executed command in integer format and remains unchanged unless the next command is executed.

Using this exit status code, you can debug the problem that occurred while executing the command, which can be extremely beneficial in shell script error handling.

The following is the list of known exit status codes from total (0-255) for bash in Linux:

Exit status Description
0 If no command is executed or a command is successfully executed, its status is set to zero.
1 It will catch the general errors.
2 It will catch the shell built-in errors.
126 Commands invoked cannot be executed.
127 Command not found.
128 Invalid argument to exit.
128+n Fatal error signal “n”.
130 The script was terminated by Control + C .
255 The exit status is out of range.

Checking the Bash Exit Status Code

The following is a demonstration of the known bash exit status code:

Example of Exit Status Code “0”

By default, when you start or restart your system (or shell session) without executing any commands, the exit status code is set to zero.

Even if you execute any command with successful output, the exit status will remain zero.

$ pwd /home/linuxtldr $ echo $? 0

Example of Exit Status Code “1”

If you pass a wrong or invalid option to the command, it will set the exit status code to a non-zero value.

$ cat -a file.txt cat: invalid option -- 'a' Try 'cat --help' for more information. $ echo $? 1

The above exit status code “1” represents that the last executed command provided an invalid option.

Example of Exit Status Code “2”

If you pass a wrong or invalid argument to the command, it will set the exit status code to “2“.

Example of Exit Status Code “127”

If you mistyped or executed the wrong command, it will set the exit status code to “127“.

$ wrongcommand wrongcommand: command not found $ echo $? 127

Example of True or False Keywords

Even if you execute keywords like “true“, it will set the exit status code to “0“, and for “false“, the value will be set to “1“, making it highly effective while writing a shell script.

$ true $ echo $? 0 $ false $ echo $? 1

Checking the Exit Status Code of Piped Commands

Читайте также:  Check available ports on linux

If you have piped one or more commands together, the exit status will store the value of the last executed command.

For the following piped commands, it will show you the exit status code for the PWD command.

$ WRONGCOMMAND | pwd /home/linuxtldr WRONGCOMMAND: command not found $ echo $? 0

Controlling the Flow of Script Using the Exit Status Code

The exit status code can be extremely helpful while writing shell scripts to handle the flow of your script with all possible errors.

For example, the following is a basic demonstration of handling a script using the exit status code:

$ cat script.sh #!/bin/bash echo "Its, Linux TLDR" status=$? [ $status -eq 0 ] && echo "command succeeded" || echo "command failed"

If you run the above script, it will print “command succeeded” on an exit status code of “0” and “command failed” on a non-zero exit status code.

$ ./script.sh Its, Linux TLDR command succeeded

However, if you modify the same script and misspell or include a wrong command, as shown.

$ cat script.sh #!/bin/bash WRONG-COMMAND status=$? [ $status -eq 0 ] && echo "command succeeded" || echo "command failed"

It will print “command failed” rather than “command succeeded”.

$ ./script.sh ./script.sh: line 3: WRONG-COMMAND: command not found command unsuccessful

The Meaning of the Exit Status Code Value Might Be Different for Different Commands

Most of the commands, like echo or cat, follow the standard exit status code. However, the meaning of the exit status code value might vary for other commands like ls and grep.

Both commands have different explanations for exit status codes “1” and “2“.

The following is the exit status code of the ls command.

LS command exit status code

The following is the exit status code of the grep command.

grep command exit status code

So, before assigning the condition using the exit status code of commands, I strongly recommend that you check their manual page or search for the command on our site (most probably you will find it) to find the meaning of their default exit status code.

If you are too lazy to do that, then define your own exit status code.

Defining the Custom Exit Status Code in Script

To remove the headache of different commands having different meanings for exit status codes, you can manually specify your own custom exit status code for a specified command (or condition) using the exit keyword.

As per rule, keep the “0” value reserved for “successful execution” and use the value between the range of (1-255) for errors.

The following is a basic script that will check if the current user is root or not; if the user is root, it will print “Root user” on screen with an exit status code of “0” or “Not root user” with an exit status code of “1“.

$ cat script.sh #!/bin/bash if [[ "$(whoami)" == "root" ]] then echo "Root user" exit 0 else echo "Not root user" exit 1 fi

Executing the above script with and without the root user.

#Executing as a non-root user $ ./script.sh Not root user $ echo $? #Verifying the result 1 #Executing as a root user $ sudo ./script.sh Root user $ echo $? #Verifying the result 0

And that was the end of this guide.

Читайте также:  Rog armoury crate linux

If you have any suggestions or good examples that need to be added to this article, please share them with us in the comment section.

Источник

Как использовать коды завершения в Bash-скриптах

Как использовать коды завершения в Bash-скриптах главное изображение

Инструменты автоматизации и мониторинга удобны тем, что разработчик может взять готовые скрипты, при необходимости адаптировать и использовать в своём проекте. Можно заметить, что в некоторых скриптах используются коды завершения (exit codes), а в других нет. О коде завершения легко забыть, но это очень полезный инструмент. Особенно важно использовать его в скриптах командной строки.

Что такое коды завершения

В Linux и других Unix-подобных операционных системах программы во время завершения могут передавать значение родительскому процессу. Это значение называется кодом завершения или состоянием завершения. В POSIX по соглашению действует стандарт: программа передаёт 0 при успешном исполнении и 1 или большее число при неудачном исполнении.

Почему это важно? Если смотреть на коды завершения в контексте скриптов для командной строки, ответ очевиден. Любой полезный Bash-скрипт неизбежно будет использоваться в других скриптах или его обернут в однострочник Bash. Это особенно актуально при использовании инструментов автоматизации типа SaltStack или инструментов мониторинга типа Nagios. Эти программы исполняют скрипт и проверяют статус завершения, чтобы определить, было ли исполнение успешным.

Кроме того, даже если вы не определяете коды завершения, они всё равно есть в ваших скриптах. Но без корректного определения кодов выхода можно столкнуться с проблемами: ложными сообщениями об успешном исполнении, которые могут повлиять на работу скрипта.

Что происходит, когда коды завершения не определены

В Linux любой код, запущенный в командной строке, имеет код завершения. Если код завершения не определён, Bash-скрипты используют код выхода последней запущенной команды. Чтобы лучше понять суть, обратите внимание на пример.

#!/bin/bash touch /root/test echo created file 

Этот скрипт запускает команды touch и echo . Если запустить этот скрипт без прав суперпользователя, команда touch не выполнится. В этот момент мы хотели бы получить информацию об ошибке с помощью соответствующего кода завершения. Чтобы проверить код выхода, достаточно ввести в командную строку специальную переменную $? . Она печатает код возврата последней запущенной команды.

Как видно, после запуска команды ./tmp.sh получаем код завершения 0 . Этот код говорит об успешном выполнении команды, хотя на самом деле команда не выполнилась. Скрипт из примера выше исполняет две команды: touch и echo . Поскольку код завершения не определён, получаем код выхода последней запущенной команды. Это команда echo , которая успешно выполнилась.

Читайте также:  Apache on suse linux enterprise server

Если убрать из скрипта команду echo , можно получить код завершения команды touch .

Поскольку touch в данном случае — последняя запущенная команда, и она не выполнилась, получаем код возврата 1 .

Как использовать коды завершения в Bash-скриптах

Удаление из скрипта команды echo позволило нам получить код завершения. Что делать, если нужно сделать разные действия в случае успешного и неуспешного выполнения команды touch ? Речь идёт о печати stdout в случае успеха и stderr в случае неуспеха.

Проверяем коды завершения

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

#!/bin/bash touch /root/test 2> /dev/null if [ $? -eq 0 ] then echo "Successfully created file" else echo "Could not create file" >&2 fi 

После рефакторинга скрипта получаем такое поведение:

  • Если команда touch выполняется с кодом 0 , скрипт с помощью echo сообщает об успешно созданном файле.
  • Если команда touch выполняется с другим кодом, скрипт сообщает, что не смог создать файл.

Любой код завершения кроме 0 значит неудачную попытку создать файл. Скрипт с помощью echo отправляет сообщение о неудаче в stderr .

Создаём собственный код завершения

Наш скрипт уже сообщает об ошибке, если команда touch выполняется с ошибкой. Но в случае успешного выполнения команды мы всё также получаем код 0 .

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

#!/bin/bash touch /root/test 2> /dev/null if [ $? -eq 0 ] then echo "Successfully created file" exit 0 else echo "Could not create file" >&2 exit 1 fi 

Теперь в случае успешного выполнения команды touch скрипт с помощью echo сообщает об успехе и завершается с кодом 0 . В противном случае скрипт печатает сообщение об ошибке при попытке создать файл и завершается с кодом 1 .

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

Скрипт уже умеет сообщать пользователям и программам об успешном или неуспешном выполнении. Теперь его можно использовать с другими инструментами администрирования или однострочниками командной строки.

В примере выше && используется для обозначения «и», а || для обозначения «или». В данном случае команда выполняет скрипт ./tmp.sh , а затем выполняет echo «bam» , если код завершения 0 . Если код завершения 1 , выполняется следующая команда в круглых скобках. Как видно, в скобках для группировки команд снова используются && и || .

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

Дополнительные коды завершения

Команда exit принимает числа от 0 до 255 . В большинстве случаев можно обойтись кодами 0 и 1 . Однако есть зарезервированные коды, которые обозначают конкретные ошибки. Список зарезервированных кодов можно посмотреть в документации.

Адаптированный перевод статьи Understanding Exit Codes and how to use them in bash scripts by Benjamin Cane. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.

Источник

Оцените статью
Adblock
detector