Shell 执行命令并测试其退出状态的Unix实用程序
我正在为一个实现应用程序模板的OCaml库编写自动化测试。在某些情况下,应用程序可能会因指定的退出代码而失败,例如当使用格式错误的命令行调用应用程序时,退出代码64Shell 执行命令并测试其退出状态的Unix实用程序,shell,unix,ocaml,automated-tests,Shell,Unix,Ocaml,Automated Tests,我正在为一个实现应用程序模板的OCaml库编写自动化测试。在某些情况下,应用程序可能会因指定的退出代码而失败,例如当使用格式错误的命令行调用应用程序时,退出代码64exit\u用法: % ./punishment.byte -x punishment.byte: illegal option -- x Usage: punishment.byte [-n number] [-p paragraph] [-c configfile] Exit 64 是否有标准的Unix实用程序可用于运行子命令/
exit\u用法
:
% ./punishment.byte -x
punishment.byte: illegal option -- x
Usage: punishment.byte [-n number] [-p paragraph] [-c configfile]
Exit 64
是否有标准的Unix实用程序可用于运行子命令/population.byte-x
,并在子命令以状态代码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\u status 64./population.byte-x
,会很好
注释
Exit
行提供信息,而不是输出的一部分正如建议的那样,您可以通过引用shell变量“$?”来检查上次命令执行的退出代码 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
您的问题的答案是否定的。在*nix系统上没有标准的实用程序来运行命令并根据特定值测试其退出代码。可能是因为你自己写一本很琐碎 我从代码中的
%
猜测您正在使用zsh。如果您实际使用的是csh(或tcsh),那么情况就不同了
也就是说,您可以很容易地编写一个shell函数来实现这一点:
expect_status() {
local expected=$1
shift
"$@"
(( $? == expected ))
}
但这将在您当前的shell环境中运行该命令,这可能会产生您不希望的副作用。它可能更好地实现为脚本-只需将其保存在$PATH中的某个位置,文件名为expect\u status
,并授予其读取和执行权限:
#!/bin/bash
expected=$1
shift
"$@"
(( $? == expected ))
或者,避开巴什主义:
#!/bin/sh
expected=$1
shift
${1+"$@"}
[ $? -eq $expected ]
在某种意义上,有一个标准的实用程序:外壳本身:
command1 && command2
仅当command1
的退出代码为0
时,上述命令才会执行command2
。或者,这:
command1 || command2
仅当command1
的退出代码不是0时,才会运行command2
要检查特定的退出状态,您可以使用其他答案中所述的$?
:
command; [ "$?" -eq 64 ] && command2
因此,您正在寻找的功能本质上是直接内置到shell中的,因此,您找不到设计用于此目的的实用程序。我不知道标准实用程序(可能有),但shell将最后一个退出代码存储在$?变量我认为您可以用几行shell脚本编写自己的实用程序,例如,如果[“$?”-eq“$expected”],然后退出0 fi。是的,有一个标准实用程序;它叫贝壳。8-}您可能感兴趣。您使用的是哪个shell?如果是csh或tcsh,那么您需要
$status
而不是$?
@KeithThompson啊,啊!☺ 我很清楚,我可以在shell中测试命令的退出状态,但是使用标准实用程序(如果有)将是自我记录的;如果[$?-eq 0]。只需执行if命令;然后回显“命令成功”;else echo“命令失败。”;fi
。测试$?
是如果工作的方式。我可以这样做,但这并不能回答问题,因为我要求有一个标准的实用程序来做这件事!更进一步,您可以像这样alias
您的命令alias check='[“$?”-eq 64]&&echo beep-beep'
,然后执行命令;检查
command; [ "$?" -eq 64 ] && command2