- 3 handy upgrades in MacOS 15.1 - especially if AI isn't your thing (like me)
- Your Android device is vulnerable to attack and Google's fix is imminent
- Microsoft's Copilot AI is coming to your Office apps - whether you like it or not
- How to track US election results on your iPhone, iPad or Apple Watch
- One of the most dependable robot vacuums I've tested isn't a Roborock or Roomba
Using the Linux set command
The Linux set command allows you to change the value of shell options or to display the names and values of shell variables. Rarely used, it is a bash builtin, but is quite a bit more complicated than most builtins.
If you use the command without any arguments, you will get a list of all the settings—the names and values of all shell variables and functions. Watch out though! You’ll end up with a torrent of output flowing down your screen. There are just short of 3,000 lines of output on my Fedora system:
$ set | wc -l 2954
The top of the list looks like what you see below, but the output gets considerably more complicated as you move through it.
$ set | head -10 BASH=/bin/bash BASHOPTS=cdspell:checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=([0]="0") BASH_ARGV=() BASH_CMDS=() BASH_COMPLETION_VERSINFO=([0]="2" [1]="11") BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="5" [1]="1" [2]="0" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
More practically, there are some very helpful things you can do with set. Let’s examine some of them.
Debugging your scripts
You can use the set -x command to do some script debugging. In other words, when you use this option, bash is going to show you a lot more output that displays what your script is up to. The script used in this example does a lot of checking and then prints the top lines of the selected file.
#!/bin/bash set -x if [ $# -lt 2 ]; then echo “Usage: $0 lines filename” exit 1 fi if [ ! -f $2 ]; then echo “Error: File $2 not found” exit 3 else echo top of file head -$1 $2 fi msg="bye" echo $msg
Without the set -x, the script would display output like this:
$ script3 3 file top of file #!/bin/bash -x date bye
With the set -x, it shows each command as it’s being run as well as the output.
$ script3 3 file + ‘[‘ 2 -lt 2 ‘]’ + [[ 3 != [0-9]* ]] + ‘[‘ ‘!’ -f file ‘]’ + echo top of file top of file + head -3 file #!/bin/bash -x date + msg=bye + echo bye Bye
You can also invoke debugging by placing the -x on the “shebang line” (i.e., the top line of the script) like this:
#!/bin/bash -x
One of the benefits of using set -x and then set +x is that the first set starts the debugging and the second set turns it off, so you can see the verbose output for a small section of a script if that is all you need to focus on.
set -x if [ ! -f $2 ]; then echo “Error: File $2 not found” exit 3 else echo top of file head -$1 $2 fi set +x
Other set options can be turned on and then off again in this same manner.
Automatic exporting
Using set -a, you can cause any variable or function that you create to be automatically exported so that subshells and scripts can use them. Here’s an example:
$ set -a $ one=1 $ two=2 $ three=3 $ four=4 $ /bin/bash <== start new shell $ echo $one $two $three $four 1 2 3 4
Exit immediately if a command fails
The set -e command will cause a script to exit as soon as it runs into an error. In this example, the set -e command is invoked.
$ cat script1 #!/bin/bash set -e cat nosuchfile echo “So long!”
As you might suspect, the “nosuchfile” file doesn’t exist, so the script exits at that point with the help of set -e. The final echo command never gets a chance to run.
$ script1 cat: nosuchfile: No such file or directory
Don’t ignore non-existent variables
By default, bash will ignore any variables that don’t exist. For example, in the script below, bash will overlook the fact that $var2 has not been defined and will simply display $var1.
$ cat script1 #!/bin/bash var1="123" echo $var1 $var2 $ ./script1 123
If you add set -u to the script, it reports the problem.
$ cat script2 #!/bin/bash set -u var1="123" echo $var1 $var2
$ ./script2 ./script1: line 5: var2: unbound variable
Many additional set options are available, but these are some of the most useful.
Copyright © 2021 IDG Communications, Inc.