On this page
When writing Bash scripts, you will frequently need to stop the execution of a script when a certain condition is met or perform some actions based on a command's exit code.
In this article we will go over the built-in bash exit command as well as the exit status codes of the commands that have been executed.
Exit Status Code
When a shell command exits, whether successfully without any errors or unsuccessfully with errors, it returns an exit code.
An exit code of zero indicates that the command was completed properly without any errors, while a non-zero indicates that an error occurred.
The $? is a special shell variable that stores the exit status of the most recently run command:
cat manifesto.txt
echo $?# output
A Gentle reminder, I use Arch BTW!
0Because the cat command was completed successfully and without error, the exit code is zero, as expected.
If you attempt to run cat command on a not-existing file, the exit code will be non-zero as shown below:
cat no-file
echo $?# output
cat: no-file: No such file or directory
1As expected, the exist status code is non-zero.
The exit status code of a command can be used for debugging and determining the reason for its failure. The man pages for each command provide information about the exit codes. When chaining commands using pipes, the exit status code is that of the last command in the chain.
Consider the following example:
ls -lah | head -n 4
echo $?# output
total 88K
drwxr-x--- 5 mint mint 4.0K Mar 13 22:24 .
drwxr-xr-x 5 root root 4.0K Nov 22 13:54 ..
-rw------- 1 mint mint 5.6K Mar 5 17:20 .bash_history
0In the preceding example, the echo $? command prints the exit status code of the head command, which is zero. However, this does not prove that the exit status code is that of the last command.
Let's look at another example where we execute the ls command on a non-existent directory:
Let's look at another example where we execute the ls command on a non-existent directory.
ls -lah no-directory | head -n 4
echo $?# output
ls: cannot access 'no-directory': No such file or directory
0Here, you can see that the ls command fails, but the exit status code displayed is still zero. This proves that the exit status code is indeed that of the last command when pipes are used to chain multiple commands.
Bash built-in exit command
Now that you know what command exist status codes are, let's look at how to arbitrary set them using the bash exit command.
The exit command is used to exit the current shell. It takes a number as a parameter and exits the shell with the status of the number you passed as a parameter value.
If no parameters were supplied, it would return the status of the most recently executed command.
$ exit NThe exit command in shell scripts can be used to return an exit status code to the shell. When an argument is passed to the exit command, that value is returned as the exit code.
Here's an example script that demonstrates the usage of the exit command:
#!/bin/bash
# Filename: checking if a specific file exists
FILE=~/logs.txt
if test -f "$FILE"
then
echo "$FILE exists."
exit 2
else
echo "$FILE doesn't exists."
exit 4
fiAfter executing the above script, running echo $? will output 2 if the file logs.txt exists, or 4 if it does not exist.
If a script ends without specifying an argument to the exit command, the exit code is the status of the last command executed in the script. Consider the following example:
#!/bin/bash
# Filename: checking if a specific file exists
FILE=~/logs.txt
if test -f "$FILE"
then
echo "$FILE exists."
exit
else
echo "$FILE doesn't exists."
touch logs.txt
exit
fiIn this case, if the file logs.txt exists, running echo $? after executing the script will output the exit status of the echo "$FILE exists." command. If the file does not exist, it will output the exit status of the touch logs.txt command.
Not specifying a value to the exit command is equivalent to exit $? or leaving the script without an explicit exit command.
Summing up
In conclusion, understanding exit status codes in Bash scripts is crucial for error handling and debugging. By utilizing the exit command, you can set custom exit codes to indicate success or failure based on specific conditions within your script.