Makefile 不会使用 touch 创建多个 txt 文件

doe*_*lin 4 makefile

我是 makefile 的新手,并尝试使用包含touch file-{1..10}.txt. 这不会按预期工作,因为它创建了一个名为的文件,file-{1..10}.txt而不是file-1.txt通过file-10.txt.

这是makefile的代码:

   .DEFAULT_GOAL := generate

say_hello:
    @echo "Hello World"

generate:
    @echo "Creating empty text files..."
    touch file-{1..10}.txt

clean:
    @echo "Cleaning up..."
    rm *.txt
Run Code Online (Sandbox Code Playgroud)

当进入make终端时,它打印

Creating empty text files...
touch file-{1..10}.txt
Run Code Online (Sandbox Code Playgroud)

并创建文件file-{1..10}.txt
进入touch file-{1..10}.txt到所述终端创建file-1.txt通过file-10.txt如常。

Mad*_*ist 5

POSIX 标准要求make始终调用 shell /bin/sh。它永远不会调用用户的首选外壳(认为非便携的灾难是什么是!)

您想要的大括号扩展不是sh. 它是由bash和其他一些 shell提供的附加功能。在/bin/sh有 bash 链接的系统上,例如 MacOS 和基于 Red Hat 的系统,大括号扩展将在 makefile 中工作。

/bin/sh有 POSIX 兼容 shell 链接的系统上dash,例如 Ubuntu,尝试在您的 makefile 配方中使用非 POSIX 功能将不起作用。

您可以写出触摸操作,也可以添加:

SHELL := /bin/bash
Run Code Online (Sandbox Code Playgroud)

到您的 makefile 以强制 make 调用bash. 请注意,您的 makefile 现在不再可移植到尚未/bin/bash安装的系统中。

  • 是的,它确实。这就是我所说的。如果您使用 bash,甚至作为 /bin/sh 调用,您仍然可以获得高级功能。在其他系统上,“/bin/sh”不是 bash。例如,在 Ubuntu 系统上,“/bin/sh”是 dash,专门编写为一个小型、快速的 shell,仅实现 POSIX 功能。在这些系统上,“/bin/sh”将不支持大括号扩展。 (2认同)