Bash 试图理解“测试”的行为<;命令>;`在狂欢节上

Bash 试图理解“测试”的行为<;命令>;`在狂欢节上,bash,Bash,假设我有一个简单的C程序(test.C): 但是当我运行test./a.out时,测试结果与退出代码不匹配: $ test ./a.out $ echo $? 0 那么,实际测试的是什么?为什么测试结果为0 您的C程序将“1”返回给shell(我更喜欢“return()”而不是exit()”,但是…) 如果您想结合“*nix”测试命令实际运行“a.out”,您可以使用如下语法: `./a.out` # classic *nix 或 但是,如果这样做,“test”将读取打印到“stdout”

假设我有一个简单的C程序(test.C):

但是当我运行
test./a.out
时,测试结果与退出代码不匹配:

$ test ./a.out
$ echo $?
0
那么,实际测试的是什么?为什么测试结果为0

  • 您的C程序将“1”返回给shell(我更喜欢“return()”而不是exit()”,但是…)

  • 如果您想结合“*nix”测试命令实际运行“a.out”,您可以使用如下语法:

    `./a.out` # classic *nix
    

  • 但是,如果这样做,“test”将读取打印到“stdout”的值,而不是程序退出时返回的值

  • 您可以在此处阅读有关测试的更多信息:

  • 以下是一个例子:

  • C程序:

    #include <stdio.h>
    
    int main (int argc, char *argv[]) {
      printf("%d\n", argc);
      return 2;
    }
    
    示例输出:

    paulsm@vps2:~$ ./tmp.sh
    Assign RETVAL the return value of a.out:
    1
      RETVAL=2
    Assign RETVAL the value printed to stdout by a.out:
      RETVAL=1
    Turn an 'trace' and run a.out with 'test':
    +++ ./a.out
    ++ '[' 1 -eq 1 ']'
    ++ echo One
    One
    
    此外:

    已经提到的几点:

    a、
    返回1
    通常比退出(1)更好

    b、 对于您的可执行文件,“test”可能是一个糟糕的名称,因为它与内置的“test”命令冲突。类似“test\u return”可能是更好的选择

  • 您的C程序将“1”返回给shell(我更喜欢“return()”而不是exit()”,但是…)

  • 如果您想结合“*nix”测试命令实际运行“a.out”,您可以使用如下语法:

    `./a.out` # classic *nix
    

  • 但是,如果这样做,“test”将读取打印到“stdout”的值,而不是程序退出时返回的值

  • 您可以在此处阅读有关测试的更多信息:

  • 以下是一个例子:

  • C程序:

    #include <stdio.h>
    
    int main (int argc, char *argv[]) {
      printf("%d\n", argc);
      return 2;
    }
    
    示例输出:

    paulsm@vps2:~$ ./tmp.sh
    Assign RETVAL the return value of a.out:
    1
      RETVAL=2
    Assign RETVAL the value printed to stdout by a.out:
      RETVAL=1
    Turn an 'trace' and run a.out with 'test':
    +++ ./a.out
    ++ '[' 1 -eq 1 ']'
    ++ echo One
    One
    
    此外:

    已经提到的几点:

    a<代码>返回1通常比退出(1)更好


    b。“test”可能是可执行文件的一个糟糕名称,因为它与内置的“test”命令冲突。类似于“test\u return”的东西可能是更好的选择。

    test
    是一个内置的Bash,通常由替代名称
    [
    调用

    最后一个命令(
    test./a.out
    )退出,状态为0表示成功,因为
    test./a.out
    检查
    /a.out
    作为字符串是否包含一个或多个字符(不是空字符串),并且由于它不是空字符串,因此返回success或0。
    test./a.out
    命令行不会执行
    a.out
    程序-您可以从程序中打印某些内容看到这一点

    在编写时,您的程序不需要
    头或
    main()
    的参数-它应该是
    int main(void)
    。如果使用
    return 1;
    而不是
    exit(1);
    ,您也可能会丢失

    要在shell中的
    if
    条件中使用退出状态,只需直接使用它:

    if ./a.out ; then
        echo Success
    else
        echo Failure
    fi
    

    经验法则:不要调用C程序
    test
    ,因为你迟早会被弄糊涂的——通常是迟早会被弄糊涂的。

    test
    是一个内置的Bash,通常由另一个名称
    [
    调用

    最后一个命令(
    test./a.out
    )退出,状态为0表示成功,因为
    test./a.out
    检查
    /a.out
    作为字符串是否包含一个或多个字符(不是空字符串),并且由于它不是空字符串,因此返回success或0。
    test./a.out
    命令行不会执行
    a.out
    程序-您可以从程序中打印某些内容看到这一点

    在编写时,您的程序不需要
    头或
    main()
    的参数-它应该是
    int main(void)
    。如果使用
    return 1;
    而不是
    exit(1);
    ,您也可能会丢失

    要在shell中的
    if
    条件中使用退出状态,只需直接使用它:

    if ./a.out ; then
        echo Success
    else
        echo Failure
    fi
    

    经验法则:不要调用C程序
    test
    ,因为你迟早会被弄糊涂的——通常是迟早会被弄糊涂的。

    我把我所有的小测试程序命名为
    testxxx
    ,其中
    xxx
    描述了它正在测试的内容。@Barmar:但你不能用空字符串代替
    xxx
    ,这是我的经验法则所反对的。对于源代码
    test.c
    ,输入
    make test
    很有诱惑力,但随后你就遇到了麻烦。对,我同意你的意见,并提到了我所做的事情。我将我所有的小测试程序命名为
    testxxx
    ,其中
    xxx
    描述了它正在测试的内容。@Barmar:但你不使用它一个空字符串代替了我的经验法则所建议的
    xxx
    。对于源代码
    test.c
    ,输入
    进行测试很有诱惑力,但随后您遇到了麻烦。对,我同意您的意见,并提到了我的工作。
    
    if ./a.out ; then
        echo Success
    else
        echo Failure
    fi