首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Makefile执行的Shell if语句总是计算为false

从Makefile执行的Shell if语句总是计算为false
EN

Stack Overflow用户
提问于 2022-07-26 11:36:14
回答 1查看 55关注 0票数 0

我需要向Makefile添加外壳if - the语句,但是if表达式的计算结果总是false。例如,下一个代码:

代码语言:javascript
运行
复制
if [1 -eq 1]; then echo "yes"; else echo "no"

打印"no

true进行评估的唯一代码是:

代码语言:javascript
运行
复制
if true; then echo "yes"; else echo "no"

为什么代码中的所有表达式(除了“true”之外)都计算为false?:(我非常感谢您的帮助。)

**请注意-这些语句在从Shell运行时工作正常

来自原始Makefile的代码片段:

代码语言:javascript
运行
复制
SIMULATION_RUN_CMD =  rm -rf $(TEST_DIR)/* && mkdir -p $(TEST_DIR) && cd $(TEST_DIR) && (cp -rf $(VIVADO_PROJ)/$(PROJECT)/export_for_sim/$(SIMULATOR)/{*.mem,.mif,design.dat,nocattrs.dat,cpm_data_sim.cdo} $(TEST_DIR) || true) && \
                                        ln -sf $(TEST_DIR)/simulation.log $(RUN_DIR)/simulation.log && \
                                        (timeout $(SIM_TIMEOUT) ${SIM_DIR}/simv +UVM_TESTNAME=$(UVM_TESTNAME) $(SIM_FLAGS) -l $(TEST_DIR)/simulation.log -do $(DO_FILE) ; \
                                        if [1 -eq 1]; then echo "if statement yes " >> $(TEST_DIR)/simulation.log; else echo "if statement no " >> $(TEST_DIR)/simulation.log; fi \
                                         || true) && \
                                        $(MODEL_POST_SIM_ACIONS)


$(SIMULATION_RUN_TAR):
    @echo -e "Make Command: $(SIMULATION_RUN_CMD)" $(PRINT_OUTPUT)
    ($(SIMULATION_RUN_CMD)) $(PRINT_OUTPUT)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-26 11:42:11

首先,命令中有一个语法错误。如果您将其准确地输入bash中,则会得到一个错误:

代码语言:javascript
运行
复制
[[1: command not found

您需要在[[之后和]]令牌之前使用空格:

代码语言:javascript
运行
复制
if [[ 1 -eq 1 ]]; then echo "yes"; else echo "no"

其次,在make运行时,它不能工作的原因是make不调用bash。Make调用POSIX标准外壳/bin/sh。如果您这样做,您将看到与make相同的行为:

代码语言:javascript
运行
复制
$ /bin/sh -c 'if [[ 1 -eq 1 ]]; then echo yes; else echo no; fi'
/bin/sh: 1: [[: not found
no

[[操作符是一个bash特定的特性。如果您想要使用POSIX特性来编写它,您应该使用:

代码语言:javascript
运行
复制
$ /bin/sh -c 'if [ 1 -eq 1 ]; then echo yes; else echo no; fi'
yes

如果您真的想要调用bash作为它的shell而不是sh,那么将其添加到makefile中:

代码语言:javascript
运行
复制
SHELL := /bin/bash

当然,您的makefile将无法在没有/bin/bash可用的任何系统上工作。

ETA

在看到您添加的非常复杂但仍不完整的代码之后,我将说:

正如我前面所说,您的脚本中有一个错误。if [1 -eq 1]是完全非法的。您必须在[之后和]之前有空格。同样,如果您自己在shell提示符下运行这个程序,您将得到同样的失败。这和制造无关。

由于此错误,if-语句将始终失败,因此这将始终运行“否则”命令,并打印"no“。

你说你没有看到任何错误信息。我无法解释,只是你用这种方式操作这个菜谱:

代码语言:javascript
运行
复制
($(SIMULATION_RUN_CMD)) $(PRINT_OUTPUT)

您不会告诉use PRINT_OUTPUT变量的值是什么,所以我只能假设它将stderr丢弃到位桶(或者可能的话,stdout和stderr都可以)。如果没有这样做,那么您就可以看到输出,就会看到正在打印的错误消息。或者可能重定向到日志文件,在这种情况下,您可以在那里查找消息。

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

https://stackoverflow.com/questions/73122670

复制
相关文章

相似问题

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