Makefile 中的 & 分隔命令

Ampersand separated commands in a Makefile

我的 Makefile 中有以下规则。

init-local-env:
    @echo 'initializing python3 local environment in .venv'
    python3 -m venv .venv && source .venv/bin/activate

但不带我到我的虚拟环境。看来,只有命令的第一部分是 Makefile 运行,因为它已经创建了 .venv 文件夹,并且只有在我 运行 source .venv/bin/activate 在终端上,它带我去环保。

但是,如果我在终端上 运行 这两个命令,它 运行 没有问题,它也会带我到环境中。

python3 -m venv .venv && source .venv/bin/activate

我试图通过引用 来使用 if 子句。

init-local-env:
    @echo 'initializing python3 local environment in .venv'
    if [ -z "$$(python3 -m venv .venv)" ]; then \
        source .venv/bin/activate; \
    fi

不过好像也没用。它给了我下面的输出并创建了 .venv 文件夹,但不执行第二个命令。

bash$ make init-local-env
initializing python3 local environment in .venv
if [ -z "$(python3 -m venv .venv)" ]; then \
        source .venv/bin/activate; \
    fi

知道吗,我做错了什么? 我如何 运行 这两个命令一个接一个地执行(使用 && )?

makefile 规则的每一行都由单独的 shell 执行。因此,在 source .venv/bin/activate 执行后,它会终止 shell 并在下一行开始一个新的,而不会影响 source .venv/bin/activate.

您可以让 GNU make 一次执行所有行 shell,请参阅 Using One Shell