为Mercurial钩子设置环境变量

1 投票
1 回答
1704 浏览
提问于 2025-04-11 09:16

我正在尝试从一个Mercurial的钩子里调用一个shell脚本,这个脚本会在我们的服务器上设置一堆环境变量。当有新的变更组进来时,这个shell脚本能正常被调用,但环境变量在调用完这个脚本后并没有被保留。

我在仓库里的hgrc文件是这样的:

[hooks]
changegroup = shell_script
changegroup.env = env

我能看到shell脚本的输出,还有env命令的输出,但env命令的输出里没有包含shell脚本设置的新环境变量。

我已经确认这个shell脚本单独运行时没问题,但在Mercurial钩子的上下文中运行时,它没有正确设置环境变量。

1 个回答

2

Shell脚本无法修改它们的环境。

http://tldp.org/LDP/abs/html/gotchas.html

一个脚本不能把变量传回给它的父进程,也就是shell,或者环境。就像我们在生物课上学到的,子进程可以从父进程那里继承,但反过来是不行的。

$ cat > eg.sh 
export FOO="bar";
^D
$ bash eg.sh 
$ echo $FOO; 

$

而且,问题更复杂,因为你有多个bash的调用。

bash 1 -> hg -> bash 2 ( shell script ) 
             -> bash 3 ( env call )

这就像是你在一个php脚本中设置了一个变量,然后希望通过简单地一个接一个地运行脚本,就能在另一个脚本中获取这个变量,实际上这是不可能的。

撰写回答