无法理解简单的shell脚本

时间:2012-11-12 22:02:17

标签: linux debugging shell gcc

我很久没有使用过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 /)

3 个答案:

答案 0 :(得分:3)

>将上述命令的标准输出重定向到命名文件。 &>重定向标准输出和标准错误。

因此cmp_out是一个文件名,它将从编译器接收标准输出和标准错误输出。 run_outa.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"第一行。