我需要向Makefile添加外壳if - the语句,但是if表达式的计算结果总是false
。例如,下一个代码:
if [1 -eq 1]; then echo "yes"; else echo "no"
打印"no
“
对true
进行评估的唯一代码是:
if true; then echo "yes"; else echo "no"
为什么代码中的所有表达式(除了“true”之外)都计算为false
?:(我非常感谢您的帮助。)
**请注意-这些语句在从Shell运行时工作正常
来自原始Makefile的代码片段:
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)
发布于 2022-07-26 11:42:11
首先,命令中有一个语法错误。如果您将其准确地输入bash中,则会得到一个错误:
[[1: command not found
您需要在[[
之后和]]
令牌之前使用空格:
if [[ 1 -eq 1 ]]; then echo "yes"; else echo "no"
其次,在make运行时,它不能工作的原因是make不调用bash。Make调用POSIX标准外壳/bin/sh
。如果您这样做,您将看到与make相同的行为:
$ /bin/sh -c 'if [[ 1 -eq 1 ]]; then echo yes; else echo no; fi'
/bin/sh: 1: [[: not found
no
[[
操作符是一个bash特定的特性。如果您想要使用POSIX特性来编写它,您应该使用:
$ /bin/sh -c 'if [ 1 -eq 1 ]; then echo yes; else echo no; fi'
yes
如果您真的想要调用bash作为它的shell而不是sh
,那么将其添加到makefile中:
SHELL := /bin/bash
当然,您的makefile将无法在没有/bin/bash
可用的任何系统上工作。
ETA
在看到您添加的非常复杂但仍不完整的代码之后,我将说:
正如我前面所说,您的脚本中有一个错误。if [1 -eq 1]
是完全非法的。您必须在[
之后和]
之前有空格。同样,如果您自己在shell提示符下运行这个程序,您将得到同样的失败。这和制造无关。
由于此错误,if-语句将始终失败,因此这将始终运行“否则”命令,并打印"no“。
你说你没有看到任何错误信息。我无法解释,只是你用这种方式操作这个菜谱:
($(SIMULATION_RUN_CMD)) $(PRINT_OUTPUT)
您不会告诉use PRINT_OUTPUT
变量的值是什么,所以我只能假设它将stderr丢弃到位桶(或者可能的话,stdout和stderr都可以)。如果没有这样做,那么您就可以看到输出,就会看到正在打印的错误消息。或者可能重定向到日志文件,在这种情况下,您可以在那里查找消息。
https://stackoverflow.com/questions/73122670
复制相似问题