Get exit code for command in bash/ksh
Below is the fixed code:
#!/bin/kshsafeRunCommand() { typeset cmnd="$*" typeset ret_code echo cmnd=$cmnd eval $cmnd ret_code=$? if [ $ret_code != 0 ]; then printf "Error : [%d] when executing command: '$cmnd'" $ret_code exit $ret_code fi}command="ls -l | grep p"safeRunCommand "$command"
Now if you look into this code few things that I changed are:
- use of
typeset
is not necessary but a good practice. It makecmnd
andret_code
local tosafeRunCommand
- use of
ret_code
is not necessary but a good practice to store return code in some variable (and store it ASAP) so that you can use it later like I did inprintf "Error : [%d] when executing command: '$command'" $ret_code
- pass the command with quotes surrounding the command like
safeRunCommand "$command"
. If you dont thencmnd
will get only the valuels
and notls -l
. And it is even more important if your command contains pipes. - you can use
typeset cmnd="$*"
instead oftypeset cmnd="$1"
if you want to keep the spaces. You can try with both depending upon how complex is your command argument. - eval is used to evaluate so that command containing pipes can work fine
NOTE: Do remember some commands give 1 as return code even though there is no error like grep
. If grep
found something it will return 0 else 1.
I had tested with KSH/BASH. And it worked fine. Let me know if u face issues running this.
It should be $cmd
instead of $($cmd)
. Works fine with that on my box.
Edit: Your script works only for one-word commands, like ls. It will not work for "ls cpp". For this to work, replace cmd="$1"; $cmd
with "$@"
. And, do not run your script as command="some cmd"; safeRun command
, run it as safeRun some cmd
.
Also, when you have to debug your bash scripts, execute with '-x' flag. [bash -x s.sh].