首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回传Makefile中的退出代码

回传Makefile中的退出代码
EN

Stack Overflow用户
提问于 2019-11-16 22:54:15
回答 2查看 135关注 0票数 0

我查了几个帖子,但没有得到我想要的答案。

我想运行一个Stata脚本作为Makefile的一部分。所以在我的目标中,我定义了

代码语言:javascript
复制
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)的输出时,我就会看到

代码语言:javascript
复制
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)。有人能告诉我我到底错过了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-17 01:00:59

你有几个问题。首先,正如@AProgrammer所指出的,菜谱中的每一行都在自己的子set中执行,因此一行中的变量集无法保存到下一行:

代码语言:javascript
复制
trial:
    @var=blue
    @echo this command has no access to what was stored in var

解决方案是将命令放在一行中。

代码语言:javascript
复制
trial:
    @var=blue ; echo this command can use what was stored in var

如果太长,用反斜杠将行括起来:

代码语言:javascript
复制
trial:
    @var=blue ;\
  echo this command can use what was stored in var

(请注意,只有一个TAB,就在@之前;"echo“左侧的空格只是一些空格,以使规则易于阅读。)

第二,您必须小心语法。在Make中展开变量的方法是$(var),但在shell中展开变量的方式是$var;在其他上下文中使用任何一种语法都不会给出所需的结果。

代码语言:javascript
复制
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‘:

代码语言:javascript
复制
trial:
    @var=blue ; echo $var will not work, but $$var will

把这一切放在一起,我们就会得到:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2019-11-17 01:28:29

请注意,您可以简化菜谱,这样就不需要保存$?的值。

代码语言:javascript
复制
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的退出状态。

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

https://stackoverflow.com/questions/58895990

复制
相关文章

相似问题

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