【问题标题】:Handling gcc warnings and output in a Bash Script在 Bash 脚本中处理 gcc 警告和输出
【发布时间】:2014-03-09 20:42:40
【问题描述】:

所以我是整个 Bash 脚本场景的新手,但我正在编写一个脚本来编译一个目录中的所有 .c 文件,我已经成功地这样做了:

    for F in *.c; do
      gcc -c -Wall -o ${F%.c} $F
    done

一切正常,但我希望输出看起来像:

ex1.c Errors
ex2.c OK
ex3.c Warnings

所以基本上我希望“Ok”的退出状态为 0(一切正常),“Warnings”的退出状态为 1(警告,但没有错误),“Errors”的退出状态为 2(未编译)。

我很难弄清楚如何做这样的事情。我四处搜索,找不到任何我发现有用的东西。不过,我很可能忽略了一些事情。

编辑:无论如何都会说:如果 gcc -Wall file.c 有错误,那么只说 Error 而不是完整的 GCC 错误处理消息?与警告和完美编译一样吗?

【问题讨论】:

  • 在 bash 中,您可以通过echo $? 返回上一个进程调用的退出状态。但是,除了零/非零之外,gcc 退出状态和您想要的内容之间的映射不会是简单的,甚至是不可能的。你看过SCons吗?我不能告诉你重点,无论是关于 bash 还是编译一堆目标文件。如果你有一个项目,那么面向 DAG 的构建器就是你想要的。
  • 有没有办法说:如果gcc file.c有错误那么echo Error?等等,等等?

标签: c bash shell


【解决方案1】:

gcc 也返回 0 退出代码作为警告。因此,您将通过以下方式区分自己:

  for F in *.c; do
      out=$(gcc -c -Wall -o ${F%.c} $F 2>&1)
      if [ $? -ne 0 ]; then
        echo $F Errors
      else
         if grep "warning:" <<<"${out}" >/dev/null ; then
          echo $F Warnings
        else
          echo $F OK
        fi
     fi
  done

【讨论】:

  • 我喜欢这背后的概念。但是我得到了不明确的重定向错误:output=$(gcc -c -Wall -o ${F%.c} $F 2>$1)。另外,您介意简要解释一下
  • 不是 2>$1 而是 2&gt;&amp;1 ;) 这就是您收到错误的原因。在 bash 中,&lt;&lt;&lt; 是从变量中读取,而不是从文件中读取。它被称为这里的字符串。你可以在这里阅读更多:gnu.org/software/bash/manual/bashref.html#Here-Strings
  • 我不敢相信我看错了!但是,是的,这是错误的结果。另外,感谢您对
【解决方案2】:

杰弗里,

要构建项目,您需要一个可以呈现 DAG 的构建工具。 make 是一个经典的例子,SCons 是一个现代工具。

为了解决您的 bash 问题,以下将报告非零退出状态:

for F in *.c; do
  gcc -c -Wall -o ${F%.c} $F  && [[ `echo $?` ]] || echo "Error"
done

&amp;&amp;|| 标记是 and 和 or。 [[ echo $? ]] 测试 gcc 调用后的退出状态。如果为零则安静,否则回显错误。

我正在解决您的具体问题,所以也许这很有用。但一般来说,在 bash for 循环中编译 .c 文件并不是一个好习惯。

【讨论】:

  • 我实际上只是又搞砸了,想出了一些非常相似的东西,这让我取得了进步。但后来我遇到了蓝月亮提出的问题。
  • 不解决警告
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 2016-07-04
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
相关资源
最近更新 更多