linux 编译和运行C++程序的Bash脚本

sigwle7e  于 2023-03-17  发布在  Linux
关注(0)|答案(5)|浏览(254)

我正在编写一个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
enyaitl3

enyaitl31#

如果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,因为它也允许更复杂的项目。

biswetbf

biswetbf2#

@ akka 什卡纳塔克:在你的例子中,你没有将错误重定向到一个变量,而是将g++的标准输出存储到一个变量中。
也许最简单的方法是让g++指示它是否成功。

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

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

a5g8bdjr

a5g8bdjr3#

通常,程序在STDERR上写入 error 输出。
语句output=$(g++ $PROG_NAME)将仅使用 STDOUT 填充变量$output(出错时为空)。
你有不同的选择。
保持您的设计,您需要做的是将STDERR重定向到STDOUT。

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

pzfprimi4#

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

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

脚本的开头使用此代码从文件夹中删除可执行文件。www.example.com的完整内容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
pxyaymoc

pxyaymoc5#

由于您的目标是编译程序,然后在编译成功时运行它,因此使用g++ program.cpp && ./a.out可能比编写脚本更容易

相关问题