Get exit code for command in bash/ksh

前端 未结 5 946
死守一世寂寞
死守一世寂寞 2021-02-01 01:08

I want to write code like this:

command=\"some command\"

safeRunCommand $command

safeRunCommand() {
   cmnd=$1

   $($cmnd)

   if [ $? != 0 ]         


        
5条回答
  •  余生分开走
    2021-02-01 01:43

    Below is the fixed code:

    #!/bin/ksh
    safeRunCommand() {
      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 make cmnd and ret_code local to safeRunCommand
    • 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 in printf "Error : [%d] when executing command: '$command'" $ret_code
    • pass the command with quotes surrounding the command like safeRunCommand "$command". If you dont then cmnd will get only the value ls and not ls -l. And it is even more important if your command contains pipes.
    • you can use typeset cmnd="$*" instead of typeset 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.

提交回复
热议问题