【问题标题】:How do I store the results of a shell command in a makefile?如何将 shell 命令的结果存储在 makefile 中?
【发布时间】:2013-10-14 18:54:42
【问题描述】:

我在本地使用 GNU Make 3.8 on MacOS (i386-apple-darwin11.3.0)

我正在尝试根据目录中的文件生成一堆测试文件。

现在我可以获取文件的基本名称,但我不知道如何将它们存储在变量中,以便生成另一个具有基本名称的文件

TEST_FILES = lib/*.js

build-test:
    @mkdir -p tests
    -@for file in $(TEST_FILES); do \
        echo $$file; \
        MYNAMES = $(basename $$file .js) \
        echo $MYNAMES; \
    done

然后我想使用 STDOUT 流的输出创建一堆名为 $MYNAME.log 的文件。

我一直坚持将名称放入变量中,解决方案 I've found so far 在我尝试实现它们时向我抛出错误

【问题讨论】:

  • 不清楚您要做什么,您是如何尝试做的,或者您是否使用了一种好的方法。假设你有lib/foo.jslib/bar.js,然后呢?
  • @beta 应该创建一个名为 test/foo.log test/bar.log 的文件

标签: shell makefile


【解决方案1】:

这一行

echo $MYNAMES; \

将替换为 make 变量 M 的值,就像你写了 $(M)YNAMES。你想要的

echo $$MYNAMES; \

改为。

这一行

   MYNAMES = $(basename $$file .js) \

无法工作 - 您正在使用一个 make 命令 basename,它只在调用子 shell 以执行规则之前执行一次,而 file 是一个 shell 变量,它会更改循环的每次迭代。您可能指的是$$(basename $$file),它将作为“$(basename $file)”传递给shell。 shell 将插入运行basename 命令的结果。

确保您确实希望将它们存储在 shell 变量中,而不是作为 make 变量。了解其中的区别很重要。

【讨论】:

  • 简而言之:您需要转义 Makefile 中要在 shell 脚本中使用的每个 $。
  • @Gavin_Smith 我也试过这种方法——MYNAMES = $$(basename $$file); \ 回声 $MYNAMES; \ -- 然后我得到“/bin/bash: MYNAMES: command not found”
  • 变量名和=符号之间不应有空格(这与分配make变量的语法不同)。
  • @GavinSmith 好的,现在我没有收到任何错误,但我现在如何使用该变量?就像我如何回显它的内容一样,目前它显示为空
  • 您可能犯的另一个错误是执行多个命令。 make recipe 中的每一行(不以 \ 结尾)都使用单独的 shell 运行,并且它们之间不共享环境变量。为避免这种情况,请在行尾使用 \ 将其全部传递给一个 shell 子进程。
猜你喜欢
  • 2013-11-25
  • 2022-10-19
  • 1970-01-01
  • 2018-05-11
  • 2012-01-29
  • 1970-01-01
  • 2020-02-13
  • 2012-04-18
  • 1970-01-01
相关资源
最近更新 更多