首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >make中的外壳状态代码

make中的外壳状态代码
EN

Stack Overflow用户
提问于 2009-04-14 16:48:26
回答 6查看 29.6K关注 0票数 19

在重构Python脚本时,我使用Makefile (在Linux下运行GNU make )自动执行繁琐的工作。该脚本创建一个输出文件,我希望确保输出文件在重构时保持不变。

然而,我发现没有办法获得一个命令的状态码来影响后续的shell if命令。

下面的规则说明了这个问题:

代码语言:javascript
复制
check-cond-codes:
    diff report2008_4.csv report2008_4.csv-save-for-regression-testing; echo no differences: =$$!=
    diff -q poalim report2008_4.csv; echo differences: =$$!=

第一个“diff”比较两个相等的文件,第二个比较两个不同的文件。输出为:

代码语言:javascript
复制
diff report2008_4.csv report2008_4.csv-save-for-regression-testing; echo no differences: =$!=
no differences: ==
diff -q poalim report2008_4.csv; echo differences: =$!=
Files poalim and report2008_4.csv differ
differences: ==

所以很明显,“$$!”是捕获“diff”的状态代码的错误变量。即使在Makefile的开头使用外壳:= /bin/bash也不能解决这个问题。

返回我需要的值的变量(如果它存在的话)将在实际规则中的'if‘命令中使用。

创建一个小型的即席shell脚本来代替在Makefile中以内联方式编写所有命令是不可取的,但我将使用它作为最后的手段。

相关信息:

EN

回答 6

Stack Overflow用户

发布于 2009-04-14 17:01:50

我认为您正在寻找$?外壳变量,它给出了前一个命令的退出代码。例如:

代码语言:javascript
复制
$ diff foo.txt foo.txt
$ echo $?
0

要在makefile中使用它,必须像在$$?中那样转义$

代码语言:javascript
复制
all:
    diff foo.txt foo.txt ; if [ $$? -eq 0 ] ; then echo "no differences" ; fi

请注意,make中规则主体中的每个命令都在单独的子subshell中运行。例如,以下内容将不起作用:

代码语言:javascript
复制
all:
    diff foo.txt foo.txt
    if [ $$? -eq 0 ] ; then echo "no differences" ; fi

因为diffif命令是在不同的外壳进程中执行的。如果要使用该命令的输出状态,则必须在相同shell的上下文中执行此操作,如我前面的示例所示。

票数 38
EN

Stack Overflow用户

发布于 2009-04-14 16:55:42

使用'$$?‘而不是“$$!”(感谢Exit Shell Script Based on Process Exit Code的第四个答案)

票数 4
EN

Stack Overflow用户

发布于 2009-04-14 16:59:17

不要忘记,每个命令都是在不同的子subshells中运行的。

这就是为什么你经常会看到这样的东西:

代码语言:javascript
复制
my_target:
    do something \
    do something else \
    do last thing.

在调试时,不要忘记每个有用的-n选项和-p选项,前者将打印命令,但不会执行它们,后者将向您显示完整的make环境,包括设置各种零碎内容的位置。

HTH

干杯,

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/748445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档