【问题标题】:Getting the output of the previous command in shell script在 shell 脚本中获取上一个命令的输出
【发布时间】:2018-09-06 08:40:16
【问题描述】:

我有以下 shell 脚本:

#!/usr/bin/env sh
./node_modules/.bin/nightwatch --env chrome --tag=enabled
exit 0

nightwatch 命令总是返回exit code 1,无论夜间值守测试是失败还是通过都没关系。所以,我想检查这个命令的控制台输出是否包含一个特定的字符串(可能是failed)来处理它并使用shell脚本返回一个正确的退出代码。

我唯一的要求是,nightwatch 命令输出在控制台上是可见的,因为由于调试原因我们需要它。

我想做这样的事情(伪代码):

#!/usr/bin/env sh
./node_modules/.bin/nightwatch --env chrome --tag=enabled
if lastOutput.contains("failed"); then
  exit 1
else
  exit 0
fi

【问题讨论】:

  • 使用 $?。这将返回最后一个命令退出代码。
  • 您可以使用命令替换。 lastOutput=$(./node_modules/.bin/nightwatch --env chrome --tag=enabled) 然后检查 lastOutput[[ $lastOutput = *failed* ]] && exit 1 || exit 0
  • 但是 nightwatch 总是返回退出代码 1,这与 nightwatch 测试是否失败无关。所以,我必须解析 nightwatch 输出来决定我必须返回哪个退出代码。
  • @Martin 我会花一些时间弄清楚 为什么 它总是退出 1;这不(或不应该)正常。
  • 没错。我知道,那是一个 nghtwatch 或一个硒虫。但起初我必须为我找到一个解决方法。我还为守夜人团队创建了一个错误问题。

标签: bash shell command-line command exit-code


【解决方案1】:

由于您在 POSIX bourne shell sh 上运行它,您可以将命令输出与 [ 运算符或 case 构造进行比较

case "$(./node_modules/.bin/nightwatch --env chrome --tag=enabled)" in
  *failed*)  exit 1;;
   *) exit 0 ;;
esac

或使用grep 的返回码并设置-q 标志使其保持沉默

if ./node_modules/.bin/nightwatch --env chrome --tag=enabled | grep -q failed; then
    exit 1 
else
    exit 0
fi

【讨论】:

  • 我更喜欢if ./node<etc> | grep -q 'failed'; then exit 1; else exit 0; fi 而不是使用$? - 更少的声明,不需要照顾$?。我会发布一个答案,但它实际上和你的一样,因此只是在这里发表评论。
  • @Inian :由于 OP 说的是 console output 而不是 standard output,因此我们必须注意错误消息 的情况failed 打印为标准错误(并非不可能的情况),因此您应该在解决方案中添加 2>&1
【解决方案2】:

有很多更有效的方法来解决这个问题,但根据您的伪代码:

#!/usr/bin/env sh
lastOutput=$(./node_modules/.bin/nightwatch --env chrome --tag=enabled)
if [[ $lastOutput = *"failed"* ]]; then
  exit 1
else
  exit 0
fi

【讨论】:

  • 你的条件永远为真; = 周围需要空格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 2012-10-11
  • 2019-01-06
  • 1970-01-01
  • 2018-02-11
相关资源
最近更新 更多