在重构Python脚本时,我使用Makefile (在Linux下运行GNU make )自动执行繁琐的工作。该脚本创建一个输出文件,我希望确保输出文件在重构时保持不变。
然而,我发现没有办法获得一个命令的状态码来影响后续的shell if命令。
下面的规则说明了这个问题:
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”比较两个相等的文件,第二个比较两个不同的文件。输出为:
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中以内联方式编写所有命令是不可取的,但我将使用它作为最后的手段。
相关信息:
发布于 2009-04-14 17:01:50
我认为您正在寻找$?
外壳变量,它给出了前一个命令的退出代码。例如:
$ diff foo.txt foo.txt
$ echo $?
0
要在makefile中使用它,必须像在$$?
中那样转义$
all:
diff foo.txt foo.txt ; if [ $$? -eq 0 ] ; then echo "no differences" ; fi
请注意,make中规则主体中的每个命令都在单独的子subshell中运行。例如,以下内容将不起作用:
all:
diff foo.txt foo.txt
if [ $$? -eq 0 ] ; then echo "no differences" ; fi
因为diff
和if
命令是在不同的外壳进程中执行的。如果要使用该命令的输出状态,则必须在相同shell的上下文中执行此操作,如我前面的示例所示。
发布于 2009-04-14 16:55:42
使用'$$?‘而不是“$$!”(感谢Exit Shell Script Based on Process Exit Code的第四个答案)
发布于 2009-04-14 16:59:17
不要忘记,每个命令都是在不同的子subshells中运行的。
这就是为什么你经常会看到这样的东西:
my_target:
do something \
do something else \
do last thing.
在调试时,不要忘记每个有用的-n选项和-p选项,前者将打印命令,但不会执行它们,后者将向您显示完整的make环境,包括设置各种零碎内容的位置。
HTH
干杯,
https://stackoverflow.com/questions/748445
复制相似问题