如何让源命令在shell脚本之外生效?

时间:2012-12-03 07:36:09

标签: bash virtualenv

我想编写一个小脚本来源我的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项目一起使用)。

2 个答案:

答案 0 :(得分:2)

您不能通过使用在子进程中运行的shell脚本来影响当前环境。

如果您在while循环之前添加pushd "$(pwd)",之后添加popd,则可以通过获取脚本文件而不是执行它来获得所需内容

答案 1 :(得分:1)

您必须使用

调用脚本
source path/to/script

. path/to/script

(同样的事)而不是运行它。这是一种安全措施,当您运行程序时,它无法更改其父进程的环境(即您的shell会话)。但是,当您使用source时,您告诉shell读取文件的内容并运行它,就像您自己键入了这些内容一样。

如果您已经以这种方式获取脚本,那么我不确定发生了什么。