Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 执行命令并测试其退出状态的Unix实用程序_Shell_Unix_Ocaml_Automated Tests - Fatal编程技术网

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

Shell 执行命令并测试其退出状态的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实用程序可用于运行子命令/

我正在为一个实现应用程序模板的OCaml库编写自动化测试。在某些情况下,应用程序可能会因指定的退出代码而失败,例如当使用格式错误的命令行调用应用程序时,退出代码64
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