我查了几个帖子,但没有得到我想要的答案。
我想运行一个Stata脚本作为Makefile的一部分。所以在我的目标中,我定义了
live_data:
@echo "Executing Stata code"
StataIC -e 'stata_code.do'
@exit_status=$?
@echo "Finished execution of Stata code."
@echo Code finished with exit code of $(exit_status)但是,每当我查看make all命令(包括live_data)的输出时,我就会看到
Executing Stata code
StataIC -e stata_code.do'
Finished execution of Stata code.
Code finished with exit code of 基本上,变量exit_code总是空的。
但是,如果我弹出一个终端,然后简单地运行StataIC -e stata_code.do,然后运行exit_status=$?和echo $exit_status,就会得到正确的结果(0或1)。有人能告诉我我到底错过了什么吗?
发布于 2019-11-17 01:00:59
你有几个问题。首先,正如@AProgrammer所指出的,菜谱中的每一行都在自己的子set中执行,因此一行中的变量集无法保存到下一行:
trial:
@var=blue
@echo this command has no access to what was stored in var解决方案是将命令放在一行中。
trial:
@var=blue ; echo this command can use what was stored in var如果太长,用反斜杠将行括起来:
trial:
@var=blue ;\
echo this command can use what was stored in var(请注意,只有一个TAB,就在@之前;"echo“左侧的空格只是一些空格,以使规则易于阅读。)
第二,您必须小心语法。在Make中展开变量的方法是$(var),但在shell中展开变量的方式是$var;在其他上下文中使用任何一种语法都不会给出所需的结果。
var=red
$(info $(var)) # this is a Make command
trial:
@var=blue ; echo this is a shell command, so $(var) will not work第三,虽然规则中的命令是shell命令,但Make将尝试在运行规则之前展开它看到的任何变量,因此我们必须用另一个'$‘来转义"$var“中的’$var‘:
trial:
@var=blue ; echo $var will not work, but $$var will把这一切放在一起,我们就会得到:
live_data:
@echo "Executing Stata code" ; \
StataIC -e 'stata_code.do' ; \
exit_status=$$? ; \
echo "Finished execution of Stata code." ; \
echo Code finished with exit code of $$exit_status发布于 2019-11-17 01:28:29
请注意,您可以简化菜谱,这样就不需要保存$?的值。
live_data:
@echo "Executing Stata code"; \
StataIC -e 'stata_code.do'; \
printf '%s\n' "Finished execution of Stata code." \
"Code finished with exit code of $$?"在这里,这两个字符串都是在StataIC之后立即调用的单个StataIC的参数,因此$?正确地引用了StataIC的退出状态。
https://stackoverflow.com/questions/58895990
复制相似问题