Make bash behave using set
The set
command is a shell builtin command that is used to set and unset a value of the local variables in shell.
The syntax of using set is as follows:
set [--abBCefhHkmnpPtuvx] [-o option] [arg …]
Some of the option values are allexport
, braceexpand
, history
, keyword
, verbose
, and xtrace
.
Using set
without any option displays the name and value of all shell variables and functions, in a format that can be reused as an input for setting and unsetting the currently set variables.
Exit on the first failure
In a shell script, by default, the next line is executed if an error occurs in the current line. Sometimes, we may want to stop running a script further after an error has been encountered. The -e
option of set
ensures to exit a script once any of the commands in a pipeline fails.
In the following shell script, do_not_exit_on_failure.sh
doesn't use set
with the option -e
:
$ cat do_not_exit_on_failure.sh
#!/bin/bash # Filename: do_not_exit_on_failure.sh # Description: Resume script after an error echo "Before error" cd /root/ # Will give error echo "After error"
After running this script, the output is as follows:
Before error do_not_exit_on_failure.sh: line 6: cd: /root/: Permission denied After error
We see that the command after the error gets executed as well. In order to stop the execution after an error is encountered, use set -e
in the script. The following script demonstrates the same:
$ cat exit_on_failure.sh
#!/bin/bash # Filename: exit_on_failure.sh # Description: Exits script after an error set -e echo "Before error" cd /root/ # Will give error echo "After error"
The output after running the preceding script is as follows:
Before error exit_on_failure.sh: line 7: cd: /root/: Permission denied
We can see that the script has been terminated after encountering an error at the line number 7
.
Enabling/disabling symbolic link's resolution path
Using set
with the -P
option doesn't resolve symbolic links. Following example demonstrate how we can enable or disable symbolic link resolution of /bin
directory which is symbolic link of /usr/bin/
directory:
$ ls -l /bin lrwxrwxrwx. 1 root root 7 Nov 18 18:03 /bin -> usr/bin $ set –P # -P enable symbolic link resolution $ cd /bin $ pwd /usr/bin $ set +P # Disable symbolic link resolution $ pwd /bin
Setting/unsetting variables
We can use the set
command to see all local variables accessible for the current process. The local variables are not accessible in the subprocess.
We can create our own variable and set it locally as follows:
$ MYVAR="Linux Shell Scripting" $ echo $MYVAR Linux Shell Scripting $ set | grep MYVAR # MYVAR local variable is created MYVAR='Linux Shell Scripting' $ bash # Creating a new bash sub-process in current bash $ set | grep MYVAR $ # Blank because MYVAR is local variable
To make a variable accessible to its subprocesses as well, use the export
command followed by the variable to be exported:
$ MYVARIABLE="Hello World" $ export MYVARIABLE $ bash # Creating a new bash sub-process under bash $ echo $MYVARIABLE Hello World
This will export the MYVARIABLE
variable to any subprocess that ran from that process. To check whether MYVARIABLE
has exported or not, run the following command:
$ export |grep MYVARIABLE declare -x MYVARIABLE="Hello World" $ export | grep MYVAR $MYVAR variable is not present in sub-process but variable MYVARIABLE is present in sub-process.
To unset local or exported variables, use the unset
command and it will reset the value of the variable to null:
$ unset MYVAR # Unsets local variable MYVAR $ unset MYVARIABLE # Unsets exported variable MYVARIABLE