9

我已经很久没有使用过 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 是什么?这些是标准输出吗?

我知道 &> 是一个重定向指令。但我一点也不明白这个脚本语法中的含义。

我正在寻找这个脚本正在做什么的高级概述。如果您需要有关我为什么使用此脚本的更多信息,请告诉我。我将包括更多关于原因的信息。

简而言之,它是一个包含增量调试的示例 (//www.st.cs.uni-saarland.de/dd/)

4

3 回答 3

4

该脚本采用一个参数,即源文件的名称。它编译该源文件,gcc如果编译成功,则执行结果。(默认情况下,gcc将可执行文件写入名为a.out.)的文件。)

如果编译失败,你很幸运,因为脚本将输出(标准输出和标准错误)保存到一个名为cmp_out. 如果执行结果产生任何输出,它会将其保存在run_out. 脚本本身不会向 stderr 或 stdout 写入任何内容。即使gcc未找到,该错误也会以cmp_out.

该脚本最奇怪的是它反转了执行的退出状态,使用if. 如果执行a.out失败,脚本以 0 退出,成功。如果a.out成功,则脚本以 1, failure 退出,这也是编译失败时执行的操作。也许感叹号是一个错误?整数后的分号是不必要的。

于 2012-11-13T03:24:06.660 回答
3

>将前面命令的标准输出重定向到一个命名文件。 &>重定向标准输出和标准错误。

cmp_out将从编译器接收标准输出和标准错误输出的文件名也是 如此。从(可能是命令构建的二进制文件)run_out接收标准输出和标准错误。a.outgcc

于 2012-11-12T22:06:41.517 回答
3

程序中还有一个错误,因为“&>”的简写语法是 bash 的东西,在常规的 sh shell 中不起作用。第一行应该是“#!/bin/bash”。

于 2016-03-03T01:36:08.147 回答