我想编写一个小脚本来源我的virtualenv(用于Python项目)目录。当我在项目目录中的某个地方时,我知道我的虚拟环境的“venv”目录位于我当前目录的祖先之一的目录中。
我想编写一个源脚本venv/bin/activate
的shell脚本,其效果应该在此shell脚本之外保留。现在没有发生这种情况。
这是我的代码:
#!/bin/bash
#set -x
while [ $PWD != "/" ]; do
#echo $PWD
if [ -d "venv" ]; then
echo "venv found in $PWD. Sourcing."
source venv/bin/activate
break
else
cd ..
fi
done
为什么它现在不起作用,我该如何解决?
修改
如果有帮助,那么venv / bin / activate的内容就在这里:http://pastebin.com/TZ40brsq 它由virtualenv工具生成(通常与Python项目一起使用)。
答案 0 :(得分:2)
您不能通过使用在子进程中运行的shell脚本来影响当前环境。
如果您在while循环之前添加pushd "$(pwd)"
,之后添加popd
,则可以通过获取脚本文件而不是执行它来获得所需内容
答案 1 :(得分:1)
您必须使用
调用脚本source path/to/script
或
. path/to/script
(同样的事)而不是运行它。这是一种安全措施,当您运行程序时,它无法更改其父进程的环境(即您的shell会话)。但是,当您使用source
时,您告诉shell读取文件的内容并运行它,就像您自己键入了这些内容一样。
如果您已经以这种方式获取脚本,那么我不确定发生了什么。