我正在尝试捕获从Makefile
内执行的命令的返回状态。
情景:
我有两个文本文件 - a.txt和b.txt(都是空的)
如果我运行测试命令,我会得到以下返回状态
test ! -s b.txt => 0
修改文本文件的内容后
test ! -s b.txt => 1
Makefile内容:
test1:
test ! -s *.txt
test2:
$(foreach file, $(wildcard *.txt ) , \
test ! -s ${file};\
)
在运行make test1
时,无论文本文件是否为空,我都会收到以下错误,返回状态为2。
/bin/sh: line 0: test: a.txt: binary operator expected
make: *** [test1] Error 2
在运行make test2
时,无论文本文件是否为空,我总是返回0状态。
如果* {1}}的测试命令返回状态,如果* .txt的大小不为零,我该如何获得非零值?
答案 0 :(得分:0)
我刚刚尝试过,test
如果您提供了许多文件名,则会出现错误:
tmp> test ! -s a.txt b.txt
-bash: test: a.txt: binary operator expected
您可能希望使用bash for循环而不是make foreach循环:
test1:
for f in *; do \
test ! -s "$$f" || exit 1; \
done
对于背景,您的原始测试:
test2:
$(foreach file, $(wildcard *.txt ) , \
test ! -s ${file};\
)
将扩展为:
test2:
test ! -s a.txt; test ! -s b.txt;
请注意,last命令的返回值(第二个test
)是配方行的返回值,因此无论a.txt
是否为空,make都不会失败。另一个副作用是在make读取时解析make $(wildcard ..)
,因此如果任何子/兄弟目标生成任何.txt
,则在执行test2时不会扩展/测试它们。