在可执行文件之后运行 &&

Dav*_*542 1 c linux gcc

我试图将以下内容作为单行程序运行以查看 ac 程序的输出:

$ gcc -o hi.o hi.c && ./hi.o && echo $?
Run Code Online (Sandbox Code Playgroud)

但是,这不会“返回”或打印任何内容。而echo $?只有当我这样做,在新行工作。例如:

$ gcc -o hi.o hi.c && ./hi.o
$ echo $?
21 # correct program output
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种行为?会发生什么后./hi.o说(好像)禁止输出后呢?

Che*_*yDT 8

可能之前的命令之一失败了(有一个非零的退出代码)。&&像大多数程序语言一样工作,它会短路。所以如果我写true && false && true,最后一个true命令永远不会运行,因为该false命令返回了一个不成功的退出代码。

(也有||相反的做法:仅当左侧失败时,它才运行右侧。)

根据您的问题,./hi.o返回的退出代码 21 非零,因此将其视为失败echo $?且不执行。

无条件地链接命令,请;改用:

gcc -o hi.o hi.c; ./hi.o; echo $?
Run Code Online (Sandbox Code Playgroud)

你也可以让它hi.o只在gcc成功时运行,就像以前一样,但无论如何运行echo

gcc -o hi.o hi.c && ./hi.o; echo $?
Run Code Online (Sandbox Code Playgroud)

(这在没有括号;的情况下&&有效,因为它的优先级低于.)