Unix实用程序,它执行命令并测试其退出状态

时间:2014-09-30 00:07:53

标签: shell unix ocaml automated-tests

我正在为Gasoline编写自动化测试,这是一个实现应用程序模板的OCaml库。在某些情况下,应用程序会因规定的退出代码而失败,例如当使用格式错误的命令行调用应用程序时退出代码64 EXIT_USAGE

% ./punishment.byte -x
punishment.byte: illegal option -- x
Usage: punishment.byte [-n number] [-p paragraph] [-c configfile]
Exit 64

是否存在可用于运行子命令./punishment.byte -x的标准Unix实用程序,如果子命令以状态代码64退出,则退出状态代码为0?像

这样的东西
% expect_status 64 ./punishment.byte -x
punishment.byte: illegal option -- x
Usage: punishment.byte [-n number] [-p paragraph] [-c configfile]
Exit 0

由于我正在使用Makefile来编排测试,因此可以使用expect_status 64 ./punishment.byte -x之类的清晰语句。

备注

  1. 控制台交互示例中的Exit行是提供信息的,而不是输出的一部分。
  2. 我很清楚我可以编写这样的工具以及如何操作,我只想确保没有标准命令就这样做。

3 个答案:

答案 0 :(得分:2)

你的问题的答案是否定的。 * nix系统上没有用于运行命令并针对特定值测试其退出代码的标准实用程序。可能是因为自己写一个是微不足道的。

我猜测你代码中的%是否正在使用zsh。如果你实际上使用的是csh(或tcsh),那么事情会有所不同。

也就是说,您可以轻松编写shell函数来执行此操作:

expect_status() {
  local expected=$1
  shift
  "$@"
  (( $? == expected ))
}

但是这会在你当前的shell环境中运行命令,这可能会产生你不想要的副作用。它可能会更好地实现为脚本 - 只需将其保存在$ PATH中的某个位置,文件名为expect_status,并为其提供读取和执行权限:

#!/bin/bash
expected=$1
shift
"$@"
(( $? == expected ))

或者,避免讽刺:

#!/bin/sh
expected=$1
shift
${1+"$@"}
[ $? -eq $expected ]

答案 1 :(得分:1)

根据建议,您可以通过引用shell变量“$?”来检查上一个命令执行的退出代码。

$ ls -bogusOption          
ls: invalid option -- 'O'
Try 'ls --help' for more information.
$ echo $?
2

shell可以用作测试退出代码的实用程序。比方说,

$ cat test.sh 
#!/usr/bin/env bash

echo "executing bogus option"
ls -bogusOption

if [ "$?" -eq "0" ]; then
    echo "command succeeded."
else
    echo "command failed"
fi

$ bash -xv ./test.sh
#!/usr/bin/env bash

echo "executing bogus option"
+ echo 'executing bogus option'
executing bogus option
ls -bogusOption
+ ls -bogusOption
ls: invalid option -- 'O'
Try 'ls --help' for more information.

if [ "$?" -eq "0" ]; then
    echo "command succeeded."
else
    echo "command failed"
fi
+ '[' 2 -eq 0 ']'
+ echo 'command failed'
command failed

答案 2 :(得分:0)

从某种意义上说,有一个标准实用程序:shell本身:

command1 && command2

如果command2的退出代码为command1,则上述内容仅会执行0。或者,这个:

command1 || command2
如果command2的退出代码不是0,

将仅运行command1

要检查特定的退出状态,您可以使用$?,如其他答案中所述:

command; [ "$?" -eq 64 ] && command2

因此,您正在寻找的功能基本上直接构建在shell中,因此,您将找不到专门用于执行此操作的实用程序。