加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 16:17:32 所属栏目:安全 来源:网络整理
导读:我想写这样的代码: command="some command"safeRunCommand $commandsafeRunCommand() { cmnd=$1 $($cmnd) if [ $? != 0 ]; then printf "Error when executing command: '$command'" exit $ERROR_CODE fi} 但这个代码不工作的方式,我想要的。 我在哪里犯错
我想写这样的代码:
command="some command"

safeRunCommand $command

safeRunCommand() {
   cmnd=$1

   $($cmnd)

   if [ $? != 0 ]; then
      printf "Error when executing command: '$command'"
      exit $ERROR_CODE
   fi
}

但这个代码不工作的方式,我想要的。
我在哪里犯错误?

下面是固定代码:
#!/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"

现在,如果你看看这段代码,我改变的几件事情是:

>使用排版不是必要的,但是一个好的做法。它使cmnd和ret_code local到safeRunCommand
>使用ret_code不是必要的,但是一个好的做法是将返回代码存储在一些变量中(并将其存储在ASAP中),以便以后可以像在printf中使用它“Error:[%d] when execution command:’$ command ‘“$ ret_code
>传递带有引号的命令,例如safeRunCommand“$ command”。如果你不然那么cmnd将只获得值ls而不是ls -l。更重要的是,如果你的命令包含管道。
>如果要保留空格,可以使用typesnd cmnd =“$ *”而不是排版cmnd =“$ 1”。你可以尝试两者,取决于你的命令参数有多复杂。
> eval用于求值,以便包含管道的命令可以正常工作

注意:记住一些命令给出1作为返回码,即使没有像grep一样的错误。如果grep找到了东西,它会返回0 else 1。

我用KSH / BASH测试。它工作正常。让我知道如果你面对问题运行这个。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读