如何在Linux终端中一行代码中编译和运行程序?

9

每次我编译和运行c文件时,我都必须输入:

gcc filename.c

a.out

我不想分两行进行操作,如何在Linux终端上一行内编译和运行?

您可以使用以下命令将编译和运行合并为一行:gcc filename.c && ./a.out

1
使用一个 make 文件。 - Matt Clark
1
看起来 . 在你的 PATH 中。这非常可怕。 - Kerrek SB
似乎是 https://stackoverflow.com/questions/27064177/edit-bash-command-gcc-to-compile-and-execute-in-one-line 的重复。 - Paradox
6个回答

17

这种方法存在一个问题,就是程序可能会在编译时出现警告,但运行时却没有给用户检查警告的机会。请参见下面的答案。 - ad absurdum

6

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

在C语言中,快速而肮脏的解决方案是一个非常糟糕的想法:

gcc myfile.c && ./a.out

如果编译失败,这将不会运行可执行文件,但当编译成功时,即使发出警告,代码也将自动运行;在C语言中,应该始终在运行代码之前至少检查警告。大多数情况下,您应该永远不要运行带有警告的代码。通常,运行具有警告的代码意味着代码存在一些未定义的行为;您不应该盲目地运行这样的代码。当然,在像上面的代码中最低限度使用警告时,可能没有太多的警告,此时应该有一些警告。在绝对最低限度的情况下,应该使用:

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

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

更好的解决方案

为了解决这个问题并减少输入量,我过去常常使用这个保存为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
您可以使用分号;来分隔命令,例如:
gcc filename.c; ./a.out

然而,如果编译成功后你可能只想运行a.out。为此,你可以使用&&

gcc filename.c && ./a.out

1

解释:

A ; B - 先运行A,然后再运行B,无论A是否成功

A && B - 只有当A成功时才运行B

A || B - 只有当A失败时才运行B


运算符示例:http://www.tecmint.com/chaining-operators-in-linux-with-practical-examples/ - Gilberto B. Terra Jr.

1

您想知道如何编译和运行程序。 我将告诉您如何编写、编译和运行。

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

0
我写过C编程,但那不是我想要的。 我需要直接执行带有输入的程序,例如: ./add_2 2 5,然后输出7。
#include <stdio.h>
int main() {
char a[100];
int a1,b1,sum=0;
fscanf(stdin,"%d %d", &a1,&b1,a);
sum = a1+b1;
fprintf(stdout,"%d\n", sum,a);
return 0;
}

这是我想要做的事情: gcc my_add2.c -o add_2 ./add_2 2 5 7
我试图弄清楚如何在执行文件的同时直接读取输入。

如果你有一个新的问题,请将其作为一个问题发布,而不是作为一个答案。 - undefined
如果你有新的问题,请点击提问按钮进行提问。如果有需要提供背景信息,请包含这个问题的链接。- 来自评论 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接