Linux bash exit status and how to set exit status in bash

ADVERTISEMENTS



More on Linux bash shell exit status codes

Every Linux or Unix command executed by the shell script or user, has an exit status. The exit status is an integer number. For the bash shell’s purposes, a command which exits with a zero (0) exit status has succeeded. A non-zero (1-255) exit status indicates failure. If a command is not found, the child process created to execute it returns a status of 127. If a command is found but is not executable, the return status is 126. All of the Bash builtins return exit status of zero if they succeed and a non-zero status on failure.

How do I display the exit status of shell command?

Can you explain bash exit status code? How do I set bash exit status in my Linux shell scripts?Each Linux or Unix command returns a status when it terminates normally or abnormally. You can use value of exit status in the shell script to display an error message or run commands. For example, if tar command is unsuccessful, it returns a code which tells the shell script to send an e-mail to sysadmins.

You can use special shell variable called $? to get the exit status of the previously executed command. To print $? variable use the echo command/printf command. The syntax is:

command

echo $?

OR

/path/to/script.sh

command

date

echo $?

## OR use the printf command ##

printf "%d

" $?

## run non-existence command ##

foobar13535

## display status code ##

echo $?



How to store the exit status of the command in a shell variable

Assign $? to a shell variable. The syntax is:

date status = $? echo "The date command exit status : ${status} " date status=$? echo "The date command exit status : ${status}"

Linux exit status and the conditional/list constructs

A simple shell script to locate host name (findhost.sh)

#!/bin/bash # set var FILE = "/etc/hosts" # get host name read -p "Enter a hostname : " hostname # try to locate hostname/computer name in $FILE grep -q -w " ${hostname} " " ${FILE} " # store exit status of grep # if found grep will return 0 exit status # if not found, grep will return a nonzero exit status status = $? if test $status -eq 0 then echo "Host ' $hostname ' found in $FILE file." else echo "Host ' $hostname ' not found in $FILE file." fi #!/bin/bash # set var FILE="/etc/hosts" # get host name read -p "Enter a hostname : " hostname # try to locate hostname/computer name in $FILE grep -q -w "${hostname}" "${FILE}" # store exit status of grep # if found grep will return 0 exit status # if not found, grep will return a nonzero exit status status=$? if test $status -eq 0 then echo "Host '$hostname' found in $FILE file." else echo "Host '$hostname' not found in $FILE file." fi

How to use the && and || operators with exit codes

The syntax is:

command && echo "success" command || echo "failed" command && echo "success" || echo "failed" command && echo "success" command || echo "failed" command && echo "success" || echo "failed"

If a dir named “/tmp/foo” not found create it:

[ ! -d "/tmp/foo" ] && mkdir -p "/tmp/foo"

For example, show usage syntax when filename not passed as the command line arg:

#!/bin/Bash _files = "$@" ## fail safe ## [ [ " $_files " == "" ] ] && { echo "Usage: $0 file1.png file2.png" ; exit 1 ; } ## continue below ## #!/bin/Bash _files="$@" ## fail safe ## [[ "$_files" == "" ]] && { echo "Usage: $0 file1.png file2.png"; exit 1; } ## continue below ##

Here is another shell script that shows usage:

#!/bin/bash set -e I =~ / bin / tags.deleted.410 O = "/tmp/https.www.cyberciti.biz.410.url.conf" t = "$1" [ ! -f " $I " ] && { echo " $I file not found." ; exit 10 ; } [ " $t " == "" ] && { echo "Usage: $0 number-of-urls-to-purge-from- $I " ; exit 11 ; } > $O cat " $I " | sort | uniq | while read -r u do uu = " ${u##https://www.cyberciti.biz} " echo "~^ $uu 1;" >> " ${O} " done echo "* Config file created at ${O} ..." echo "* Installing ${O} file on utls-wp-mg-www ..." ~ / bin / install.py " ${O} " echo "* Send config to rest of cluster nodes ... " ~ / bin / install.py --sync --cluster --reload cbz-www echo "* Building list purge urls for Cloudflare CDN ..." sleep 1 url = "" while IFS = read -r u do url = " $url $u " done <<< " $(tail -${t} ${I}) " [ " $url " ! = "" ] && ~ / bin / cloudflare.purge.urls.sh " $url " [ -f " $O " ] && rm -f " $O " #!/bin/bash set -e I=~/bin/tags.deleted.410 O="/tmp/https.www.cyberciti.biz.410.url.conf" t="$1" [ ! -f "$I" ] && { echo "$I file not found."; exit 10; } [ "$t" == "" ] && { echo "Usage: $0 number-of-urls-to-purge-from-$I"; exit 11; } >$O cat "$I" | sort | uniq | while read -r u do uu="${u##https://www.cyberciti.biz}" echo "~^$uu 1;" >>"${O}" done echo "* Config file created at ${O} ..." echo "* Installing ${O} file on utls-wp-mg-www ..." ~/bin/install.py "${O}" echo "* Send config to rest of cluster nodes ... " ~/bin/install.py --sync --cluster --reload cbz-www echo "* Building list purge urls for Cloudflare CDN ..." sleep 1 url="" while IFS= read -r u do url="$url $u" done <<<"$(tail -${t} ${I})" [ "$url" != "" ] && ~/bin/cloudflare.purge.urls.sh "$url" [ -f "$O" ] && rm -f "$O"

List of common exit codes for GNU/Linux

Exit Code Description 0 Success 1 Operation not permitted 2 No such file or directory 3 No such process 4 Interrupted system call 5 Input/output error 6 No such device or address 7 Argument list too long 8 Exec format error 9 Bad file descriptor 10 No child processes 11 Resource temporarily unavailable 12 Cannot allocate memory 13 Permission denied 14 Bad address 15 Block device required 16 Device or resource busy 17 File exists 18 Invalid cross-device link 19 No such device 20 Not a directory 21 Is a directory 22 Invalid argument 23 Too many open files in system 24 Too many open files 25 Inappropriate ioctl for device 26 Text file busy 27 File too large 28 No space left on device 29 Illegal seek 30 Read-only file system 31 Too many links 32 Broken pipe 33 Numerical argument out of domain 34 Numerical result out of range 35 Resource deadlock avoided 36 File name too long 37 No locks available 38 Function not implemented 39 Directory not empty 40 Too many levels of symbolic links 42 No message of desired type 43 Identifier removed 44 Channel number out of range 45 Level 2 not synchronized 46 Level 3 halted 47 Level 3 reset 48 Link number out of range 49 Protocol driver not attached 50 No CSI structure available 51 Level 2 halted 52 Invalid exchange 53 Invalid request descriptor 54 Exchange full 55 No anode 56 Invalid request code 57 Invalid slot 59 Bad font file format 60 Device not a stream 61 No data available 62 Timer expired 63 Out of streams resources 64 Machine is not on the network 65 Package not installed 66 Object is remote 67 Link has been severed 68 Advertise error 69 Srmount error 70 Communication error on send 71 Protocol error 72 Multihop attempted 73 RFS specific error 74 Bad message 75 Value too large for defined data type 76 Name not unique on network 77 File descriptor in bad state 78 Remote address changed 79 Can not access a needed shared library 80 Accessing a corrupted shared library 81 .lib section in a.out corrupted 82 Attempting to link in too many shared libraries 83 Cannot exec a shared library directly 84 Invalid or incomplete multibyte or wide character 85 Interrupted system call should be restarted 86 Streams pipe error 87 Too many users 88 Socket operation on non-socket 89 Destination address required 90 Message too long 91 Protocol wrong type for socket 92 Protocol not available 93 Protocol not supported 94 Socket type not supported 95 Operation not supported 96 Protocol family not supported 97 Address family not supported by protocol 98 Address already in use 99 Cannot assign requested address 100 Network is down 101 Network is unreachable 102 Network dropped connection on reset 103 Software caused connection abort 104 Connection reset by peer 105 No buffer space available 106 Transport endpoint is already connected 107 Transport endpoint is not connected 108 Cannot send after transport endpoint shutdown 109 Too many references 110 Connection timed out 111 Connection refused 112 Host is down 113 No route to host 114 Operation already in progress 115 Operation now in progress 116 Stale file handle 117 Structure needs cleaning 118 Not a XENIX named type file 119 No XENIX semaphores available 120 Is a named type file 121 Remote I/O error 122 Disk quota exceeded 123 No medium found 125 Operation canceled 126 Required key not available 127 Key has expired 128 Key has been revoked 129 Key was rejected by service 130 Owner died 131 State not recoverable 132 Operation not possible due to RF-kill 133 Memory page has hardware error

The perror command explain error codes which is part of MySQL/MariaDB package:

perror 0

perror 1

Conclusion

This page explained bash exit status and related commands. For more info see bash shell man page here.