在bash/ksh中获取命令的退出代码

Kol*_*sar 52 unix bash ksh exit

我想写这样的代码:

command="some command"

safeRunCommand $command

safeRunCommand() {
   cmnd=$1

   $($cmnd)

   if [ $? != 0 ]; then
      printf "Error when executing command: '$command'"
      exit $ERROR_CODE
   fi
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码并没有按照我想要的方式运行.哪里弄错了?

hav*_*exz 68

以下是固定代码:

#!/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"
Run Code Online (Sandbox Code Playgroud)

现在,如果你查看这段代码,我改变的一些事情是:

  • 使用typeset不是必要的,而是一种良好的做法.它制作cmndret_code本地safeRunCommand
  • 使用ret_code不是必要的,但是一个很好的做法是将返回代码存储在某个变量中(并尽快存储),以便您可以像以后一样使用它printf "Error : [%d] when executing command: '$command'" $ret_code
  • 传递带命令的命令,如命令safeRunCommand "$command".如果你没有,那么cmnd只会获得价值ls而不是ls -l.如果您的命令包含管道,则更为重要.
  • 如果你想保留空间,你可以使用typeset cmnd="$*"而不是typeset cmnd="$1".您可以尝试使用两者,具体取决于命令参数的复杂程度.
  • eval用于评估,以便包含管道的命令可以正常工作

注意:请记住一些命令将1作为返回代码,即使没有错误grep.如果grep找到了什么,它将返回0否则1.

我用KSH/BASH测试过.它工作得很好.如果您遇到问题,请告诉我.


seh*_*ehe 5

尝试

safeRunCommand() {
   "$@"

   if [ $? != 0 ]; then
      printf "Error when executing command: '$1'"
      exit $ERROR_CODE
   fi
}
Run Code Online (Sandbox Code Playgroud)