首页 > 解决方案 > 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

任何想法,我做错了什么?我怎样才能一个接一个地运行这两个命令(使用 && )?

标签: pythonmakefilevirtualenvpython-venv

解决方案


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

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


推荐阅读