我希望通过在我将执行某些模拟代码的任何目录中运行脚本来编写一个python脚本来创建一些适当的环境变量,并且我已经读过我不能写一个脚本来使这些env变量持续存在mac os终端.所以有两件事:
这是真的?
和
这似乎是一件有用的事情; 一般来说为什么不可能?
你无法从python中做到这一点,但一些聪明的bash技巧可以做类似的事情.基本原因是:环境变量存在于每进程内存空间中.使用fork()创建新进程时,它继承其父级的环境变量.在shell中设置环境变量(例如bash)时,如下所示:
export VAR="foo"
你正在做的是告诉bash将其进程空间中的变量VAR设置为"foo".当你运行一个程序时,bash使用fork()然后使用exec()来运行程序,所以从bash运行的任何东西都会继承bash环境变量.
现在,假设您要创建一个bash命令,该命令使用当前目录中名为".data"的文件中的内容设置一些环境变量DATA.首先,您需要有一个命令来从文件中获取数据:
cat .data
打印数据.现在,我们要创建一个bash命令来在环境变量中设置该数据:
export DATA=`cat .data`
该命令获取.data的内容并将其放入环境变量DATA中.现在,如果你把它放在别名命令中,你有一个bash命令来设置你的环境变量:
alias set-data="export DATA=`cat .data`"
您可以将该别名命令放在主目录中的.bashrc或.bash_profile文件中,以便在您启动的任何新bash shell中使用该命令.
一种解决方法是输出export
命令,让父shell评估这个.
thescript.py
:
import pipes import random r = random.randint(1,100) print("export BLAHBLAH=%s" % (pipes.quote(str(r))))
..和bash别名(在大多数shell中也可以这样做..甚至tcsh!):
alias setblahblahenv="eval $(python thescript.py)"
用法:
$ echo $BLAHBLAH $ setblahblahenv $ echo $BLAHBLAH 72
您可以输出任意shell代码,包括多个命令,如:
export BLAHBLAH=23 SECONDENVVAR='something else' && echo 'everything worked'
只记得要小心逃避任何动态创建的输出(pipes.quote
模块对此有好处)