Debugging Shell Scripts in Linux
Abstract: echo "OSNAME=$OSNAME" Now run the script with -n option $ sh -n debug_quotes/bin/rm -f /tmp/users.txt Now execute the script with -v option [email pro
In most of the programming languages debugger tool is available for debugging. A debugger is a tool that can run a program or script that enables you to examine the internals of the script or program as it runs. In the shell scripting we don」t have any debugger tool but with the help of command line options (-n, -v and -x ) we can do the debugging.
Disabling the Shell ( -n option)The -n option, shot for noexec ( as in no execution), tells the shell to not run the commands. Instead, the shell just checks for syntax errors. This option will not convince the shell to perform any more checks. Instead the shell just performs the normal syntax check. With -n option, the shell doesn’t execute your commands, so you have a safe way to test your scripts if they contain syntax error.
The follow example shows how to use -n option.
Let us consider a shell script with a name debug_quotes.sh
#!/bin/bash echo "USER=$USER echo "HOME=$HOME" echo "OSNAME=$OSNAME"Now run the script with -n option
$ sh -n debug_quotes debug_quotes: 8: debug_quotes: Syntax error: Unterminated quoted string
As the above outputs shows that there is syntax error , double quotes are missing.
Displaying the Scripts Commands ( -v option )The -v option tells the shell to run in verbose mode. In practice , this means that shell will echo each command prior to execute the command. This is very useful in that it can often help to find the errors.
Let us create a shell script with the name 「listusers.sh」 with below contents
[email protected]:~$ cat listusers.sh #!/bin/bash cut -d : -f1,5,7 /etc/passwd | grep -v sbin | grep sh | sort > /tmp/users.txt awk -F':' ' { printf ( "%-12s %-40s\n", $1, $2 ) } ' /tmp/users.txt #Clean up the temporary file. /bin/rm -f /tmp/users.txtNow execute the script with -v option
[email protected]:~$ sh -v listusers.sh #!/bin/bash cut -d : -f1,5,7 /etc/passwd | grep -v sbin | grep sh | sort > /tmp/users.txt awk -F':' ' { printf ( "%-12s %-40s\n", $1, $2 ) } ' /tmp/users.txt guest-k9ghtA Guest,,, guest-kqEkQ8 Guest,,, guest-llnzfx Guest,,, pradeep pradeep,,, mail admin Mail Admin,,, #Clean up the temporary file. /bin/rm -f /tmp/users.txt [email protected]:~$
In the above output , script output gets mixed with commands of the scripts. But however , with -v option , at least you get a better view of what the shell is doing as it runs your script.
Combining the -n & -v OptionsWe can combine the command line options ( -n & -v ). This makes a good combination because we can check the syntax of a script while seeing the script output.
Let us consider a previously used script 「debug_quotes.sh」
[email protected]:~$ sh -nv debug_quotes.sh #!/bin/bash #shows an error. echo "USER=$USER echo "HOME=$HOME" echo "OSNAME=$OSNAME" debug_quotes: 8: debug_quotes: Syntax error: Unterminated quoted string [email protected]:~$Tracing Script Execution ( -x option )
The -x option, short for xtrace or execution trace, tells the shell to echo each command after performing the substitution steps. Thus , we can see the values of variables and commands. Often, this option alone will help to diagnose a problem.
In most cases, the -x option provides the most useful information about a script, but it can lead to a lot of output. The following example show this option in action.
[email protected]:~$ sh -x listusers.sh + cut -d :+ -f1,5,7 /etc/passwd grep -v sbin + sort + grep sh + awk -F: { printf ( "%-12s %-40s\n", $1, $2 ) } /tmp/users.txt guest-k9ghtA Guest,,, guest-kqEkQ8 Guest,,, guest-llnzfx Guest,,, pradeep pradeep,,, mail admin Mail Admin,,, + /bin/rm -f /tmp/users.txt [email protected]:~$
In the above output, shell inserted a + sign in front of the commands.
Also Read: How to define and use functions in Linux Shell Script