我很久没有使用过shell脚本了。我在网上寻求帮助,但没有找到足够的指南..
以下是我想要了解的代码:
#!/bin/sh
# -*-sh-*-
if gcc $1 &> cmp_out; then
if ! ./a.out &> run_out; then
exit 0; # Success.
fi
fi
exit 1; # Failure.
什么是cmp_out和run_out?这些是std_out吗?
我知道&>是一个重定向指令。但是我没有在这个脚本语法中得到这意味着什么。
我正在寻找这个脚本正在做什么的高级概述。如果您需要有关我使用此脚本的原因的更多信息,请通知我。我将详细介绍原因。
简而言之,它是delta调试的一个包含示例(//www.st.cs.uni-saarland.de/dd /)
答案 0 :(得分:3)
>
将上述命令的标准输出重定向到命名文件。 &>
重定向标准输出和标准错误。
因此cmp_out
是一个文件名,它将从编译器接收标准输出和标准错误输出。 run_out
从a.out
(可能是由gcc
命令构建的二进制文件)接收标准输出和标准错误。
答案 1 :(得分:3)
此脚本采用一个参数,即源文件的名称。它使用gcc
编译该源文件,如果该编译成功,则执行结果。 (默认情况下,gcc
将可执行文件写为名为a.out
的文件。)
如果编译失败,您很幸运,因为脚本将输出(标准输出和标准错误)保存到名为cmp_out
的文件中。如果执行的结果产生任何输出,则将其保存在run_out
中。脚本本身没有向stderr或stdout写入任何内容。即使找不到gcc
,该错误也会以cmp_out
结尾。
关于脚本最奇怪的是它使用if
之后的感叹号来反转执行的退出状态。如果执行a.out
失败,则脚本将以0退出,成功。如果a.out
成功,则脚本将以1退出,失败,这也是编译失败时的操作。也许感叹号是错误的?整数后面的分号是不必要的。
答案 2 :(得分:3)
该程序中还存在一个错误,即"&>"的简写语法。是一个bash的东西,并没有在常规的sh shell中工作。应该是"#!/ bin / bash"第一行。