我的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
之后,才会将我带到环境中。 / p>
但是,如果我在终端上运行这两个命令,它运行没有问题,它也带我到环境。
python3 -m venv .venv && source .venv/bin/activate
我试图通过引用this question来使用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
任何想法,我做错了什么? 我怎么能一个接一个地运行这两个命令(使用&&)?
答案 0 :(得分:1)
makefile规则的每一行都由一个单独的shell执行。因此,在source .venv/bin/activate
执行后,它会终止该shell并在下一行开始一个新的shell而不会产生source .venv/bin/activate
的影响。
您可以让GNU make在一个shell中执行所有行,请参阅Using One Shell。