Bash 试图理解“测试”的行为<;命令>;`在狂欢节上
假设我有一个简单的C程序(test.C): 但是当我运行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”
test./a.out
时,测试结果与退出代码不匹配:
$ test ./a.out
$ echo $?
0
那么,实际测试的是什么?为什么测试结果为0
`./a.out` # classic *nix
或
#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”可能是更好的选择
`./a.out` # classic *nix
或
#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