如何在linux终端上一行编译运行?

Posted

技术标签:

【中文标题】如何在linux终端上一行编译运行?【英文标题】:How to compile and run in one line on linux terminal? 【发布时间】:2017-06-11 03:38:51 【问题描述】:

每次编译运行c文件,我都要输入:

gcc 文件名.c

a.out

我不想分两行做,

【问题讨论】:

使用make 文件。 看起来. 在您的PATH 中。太可怕了。 好像是***.com/questions/27064177/…的副本 【参考方案1】:

试试

gcc filename.c && a.out

如果第一个命令成功,它只会运行第二个命令。见https://askubuntu.com/questions/334994/which-one-is-better-using-or-to-execute-multiple-commands-in-one-line

【讨论】:

这个问题的一个问题是,程序可能会在编译时出现警告,然后在运行时没有给用户检查警告的机会。请参阅下面的答案。【参考方案2】:

您可以使用; 分隔命令。比如:

gcc filename.c; ./a.out

但是,如果编译成功,您可能只想运行 a.out。为此,您可以使用&&:

gcc filename.c && ./a.out

【讨论】:

【参考方案3】:

快速而肮脏的解决方案是错误的

快速而肮脏的解决方案在 C 中是一个非常糟糕的主意:

gcc myfile.c && ./a.out

如果编译失败,这将不会运行可执行文件,但是当编译成功时,代码即使发出警告也会自动运行;在 C 语言中,您应该始终在尝试运行代码之前至少检查警告。在大多数情况下,您不应该只运行编译时带有警告的代码。通常运行带有警告的代码意味着代码有一些未定义的行为;你不应该如此盲目地奔跑。当然,在上面的代码中至少有警告,可能不会有很多警告,但无论如何应该有。在绝对最小值,应该使用:

gcc myfile.c -Wall -Wextra -Werror && ./a.out

使用-Wall -Wextra 会针对许多导致未定义行为的愚蠢错误发出警告,而-Werror 会防止编译后带有警告的代码自动运行。

更好的解决方案

为了解决这个问题,输入less,我曾经在我的搜索路径中使用这个保存为crepl的bash脚本:

#!/bin/bash
gcc -std=c99 -Wall -Wextra -Wpedantic -Werror $1 -o tempout &&\
    ./tempout && rm tempout

当我想快速测试一些保存在其中的源代码时,例如myfile.c,我可以在命令行输入:

crepl myfile.c

由于-Werror,如果编译失败,代码将不会运行,如果编译时出现警告,它将不会运行。如果编译成功,则程序运行,运行后临时可执行文件被删除。

改进

自从最初写这个答案以来,我已经将我的解决方案演变成一个稍微花哨的 bash 脚本,它接受编译器、链接库等可选的进一步参数。

#!/usr/bin/env bash
# crun
#
# A script to invoke gcc, build the executable, execute the binary,
# and cleanup after. The script will exit without running the executable
# if there are any compiler errors or warnings.
#
# This script uses -std=c18, but it could probably be modified so that
# the version is taken from a command-line parameter, defaulting to c18.
#
# Any commands following the crun invocation are appended to CMD.
CMD="gcc -std=c18 -Wall -Wextra -Wpedantic -Werror"
TEMPFILE="tempfile$$"
for ARG in "$@"
do
    CMD+=" $ARG"
done
CMD+=" -o $TEMPFILE && ./$TEMPFILE && rm $TEMPFILE"

eval $CMD

现在如果我需要链接,例如数学库:

crun myfile.c -lm

成功了,如果出现任何错误或警告(已达到合理水平)则失败,然后自行清理。

【讨论】:

【参考方案4】:

您想要如何编译和运行。 我给你如何编写、编译和运行。

cat << EOF > temp.c && gcc temp.c ; ./a.out ; rm temp.c a.out
#include <stdio.h>
int main() printf("%s\n", "Hello World!"); return 0; 
EOF

如果你经常使用这样的东西,你可能也会对此感兴趣:

#!/bin/sh
# GCC in the streams

temp="temp.c"

sgcc() 
    (
        rm "$temp" # just to be sure
        # append every line from shell to the temp file
        while read -r l; do printf "%s\n" "$l" >>"$temp"; done
        cat "$temp"
        gcc "$temp"
        exitcode=$?
        ./a.out
        rm "$temp" a.out
        exit $exitcode
    )

你可以像下面这样调用:

sgcc << EOF
#include <stdio.h>
int main() printf("%s\n", "Hello World!"); return 0; 
EOF

【讨论】:

【参考方案5】:

解释:

A ; B – 运行A,然后运行B,不管A的成功或失败

A && B – 仅当 A 成功时才运行 B

A || B – 仅当 A 失败时才运行 B

【讨论】:

运营商样本:tecmint.com/chaining-operators-in-linux-with-practical-examples【参考方案6】:

在你的 .(shell)rc 中添加别名:

alias gcb='f() gcc "$1" -o "$2"; ./"$2"; unset -f f; ; f'
alias gcr='f() gcc "$1"; ./a.out; rm -f a.out; unset -f f; ; f'

第一个修改二进制文件的名称并执行它。第二个编译、运行和删除二进制文件。

演示 gcb:

~$ gcb main.c build 
Hello World
~$ ls
main.c build

演示 gcr:

~$ gcr main.c  
Hello World
~$ ls
main.c 

访问别名here的原始结构。

【讨论】:

以上是关于如何在linux终端上一行编译运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 linux 终端中同时编译和运行 c++ 代码?

SQL 代码在在线编译器上运行良好,但在 Linux 终端中由 MariaDB 编译时失败(错误号:150)

如何在 Linux 终端中使用 MCR(Matlab 编译器运行时)运行 Matlab 文件?

Linux的终端怎么运行C语言

用于 LINUX 的 MATLAB 编译器

在Linux系统中,如何运行一个C语言程序?