【问题标题】:Bash script to compile and run C++ program用于编译和运行 C++ 程序的 Bash 脚本
【发布时间】:2020-05-03 06:05:56
【问题描述】:

我正在编写一个 bash 脚本来编译和运行一个 C++ 程序。这是我的脚本

#!/bin/bash
PROG_NAME=$1
output=$(g++ $PROG_NAME)  #redirect the error to a variable
echo $output              #show the error on stdout
if [$output = ""] 
then
    ./a.out
fi

如果程序编译失败,我不想运行a.out 文件。为此,我创建了一个变量来存储编译时错误消息。但是这种方法似乎不起作用,因为输出没有被重定向到变量。还有其他方法吗?

编辑

这是对我有用的脚本

#!/bin/bash
PROG_NAME=$1
g++ -Werror $PROG_NAME
if [[ $? == 0 ]]; then
    ./a.out
fi

【问题讨论】:

  • “用于编译和运行 C++ 程序的 Bash 脚本”顺便说一句:这就是 make 的设计目的。使用手工编写的脚本进行编译根本不是一个好主意。因此,您只需开始使用专为您想做的工作而设计的工具!

标签: linux bash


【解决方案1】:

通常,程序会在STDERR 上写入错误输出。

语句output=$(g++ $PROG_NAME) 将仅使用STDOUT 填充变量$output(如果出现错误,则为空)。

这里有不同的选择。

保留您的设计,您需要做的是在 STDOUT 上重定向 STDERR。 简单地说:

output=$(g++ $PROG_NAME 2>&1)

【讨论】:

【解决方案2】:

如果 g++ 失败,它将返回一个非零返回值,可以使用 Bash if 命令检查:

output=$(g++ $PROG_NAME 2>&1)
if [[ $? != 0 ]]; then
    # There was an error, display the error in $output
    echo -e "Error:\n$output"
else
    # Compilation successfull
    ./a.out
fi

一个可能更好的解决方案 (IMO) 是学习如何使用 makefile,因为它也将允许更复杂的项目。

【讨论】:

  • 即使程序编译失败,G++仍然返回'0'
  • @AkashKarnatak 其实不是,只是我的比较是错误的。更新
  • $?无论程序是否编译,总是返回 0。看到这个pastebin.com/xxtdLgW9
  • @AkashKarnatak It works for me。重要的部分是在编译和检查之间没有任何命令
  • 在我的情况下,g++ 返回的是警告而不是错误消息,这就是 $& 返回 0 的原因。如果我使用g++ -Werror $PROG_NAME bash 脚本工作正常
【解决方案3】:

您可以使用以下命令检查此可执行文件是否存在:

if test -f "$FILE"; then
    echo "$FILE exist"
    ./$FILE
fi

脚本的开头使用此代码从文件夹中删除可执行文件。 run.sh 的完整内容:

#!/bin/bash
FILE=a.out
if test -f "$FILE"; then
    echo "$FILE removed!"
    rm $FILE
fi
PROG_NAME=$1
echo $PROG_NAME
output=$(g++ $PROG_NAME)  #redirect the error to a variable
echo $output              #show the error on stdout
if test -f "$FILE"; then
    echo "$FILE exist"
    ./$FILE
fi

然后使用:

bash run.sh main.cpp

【讨论】:

    【解决方案4】:

    @AkashKarnatak :在您的示例中,您不会将错误重定向到变量,而是将 g++ 的标准输出存储到变量中。

    也许最简单的方法是让g++ 指示它是否成功。这可以通过

    g++ $PROG_NAME && ./a.out
    

    这会显示所有错误,并且由于 g++ 在错误时设置了非零退出代码,因此只有在没有错误时才会执行结果文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 2021-05-21
      • 2020-11-04
      • 2011-07-27
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多