It’s funny how through small daily tasks sometimes it happen to find new features or commands that you do not knew not, and today this thing happened to me.
In particular, I had to do something trivial on the shell of a server, run : command1 | tail-n 2
i use tail
to keep, from a significant long output, only the last 2 lines which then i use in another function, but beyond this, I needed to understand if command1 was terminated with an exit code of 0 or if the code was not 0 which number it was.
A simple:
.... comando1 | tail -n 2 if [ $? -ne 0 ] then echo "comando1 fallito." EXIT_CODE=1 fi .... |
Does not work because the exit code comes from the command tail
, which in my case is always 0.
So I Googled a bit and found more than a solution for this simple problem.
Ok, let’s start with the solution i’ve used, for bash:
1) If you have cmd1 | cmd2 | cmd3
In Bash the exit codes are provided in the PIPESTATUS special array. cmd1 exit code is in ${PIPESTATUS[0]}, cmd3 exit code in ${PIPESTATUS[2]}, so that $? is always the same as ${PIPESTATUS: -1}. But is really so simple ?
Yes once you know this, getting the right exit code is trivial !
So my code has become:
command1 | tail -n 2
if [ ${PIPESTATUS[0]} -ne 0]
then
echo “command1 failed.”
EXIT_CODE = 1
fi
2) You can use a similar solution also for zsh also in this shell the exit codes are provided in the pipestatus special array. cmd1 exit code is in $pipestatus[1], cmd3 exit code in $pipestatus[3], so that $? is always the same as $pipestatus[-1].
So, as you can see this is exactly the same solution used in bash.
3) For Ksh and probably other bash like shell, you need to use a trick to pass the exit codes to the main shell. You can do it using a pipe(2). Instead of running “cmd1”, you run “cmd1; echo $?” and make sure $? makes it way to the shell.
This is the most complex example, and i suggest to take a look at the I/O redirection in Unix/Linux if you have some doubt.
#! /usr/bin/ksh exec 4>&1 tail -n 2 >&4 |& exec >&p command1 exitcode=$? exec >&- >&4 wait if [ ${exitcode} -ne 0] then echo "command1 failed." EXIT_CODE = 1 fi |
So in conclusion, luckily for me in Bash there is that special array !
And many thanks to the forum unix.com for all the useful information available.
Popular Posts:
- None Found