2012-06-18 12 views
9

a.sh如何通过shell脚本导出变量?

#! /bin/sh 
export x=/usr/local 

,我们可以在命令行做source ./a。但我需要通过shell脚本进行导出。

b.sh

#! /bin/sh 
. ~/a.sh 

没有错误......但$x在命令行会显示什么。所以它没有出口。

任何想法如何使它工作?子壳


a.sh

#! /bin/sh 
export x=/usr/local 
----------- 
[email protected]: ./a.sh 
[email protected]: echo $x 

[email protected]: <insert ....> 
+0

相关:http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash-scrip#176788 – lesmana

回答

17

你不能这样做,通过一个shell脚本的出口,因为shell脚本在子shell进程中运行,只有孩子将继承出口。

之所以使用源是有当前shell执行命令

这是很常见的地方导出命令在一个文件中,如.bashrc中哪些是bash将源在启动(或类似的文件等壳)

另一个想法是,你可以创造出它的输出产生export命令shell脚本:

shell$ cat > script.sh 
#!/bin/sh 
echo export foo=bar 
^D 
chmod u+x script.sh 

,然后让当前shell执行该输出

shell$ `./script.sh` 

shell$ echo $foo 
bar 

shell$ /bin/sh 
$ echo $foo 
bar 

(注意以上脚本的调用是由反引号包围,以使所述壳执行脚本的输出)

+0

谢谢。什么是'^ D'? – CppLearner

+0

键入ctrl-D,然后返回完成编写您正在创建的文件与猫 –

+0

谢谢。我更新了我的帖子。我试过了,但是当我打印出来时,只是给了我一个空行。什么都没发生? – CppLearner

1

导出变量到环境中不仅使该变量可见子进程。小孩无法修改其父母的环境。

+0

谢谢你让我知道,马克。 – CppLearner

31

你可以把导出报表在shell脚本,然后使用“源”命令当前进程执行:

source a.sh 

我希望这有助于。

+4

简短,清晰,正确。 –

+2

这个答案应该有一个勾号 – chicharito

+2

这个答案应该有一个勾号+1 – iownthegame

0

另一种可以做到这一点的方法是为了将脚本放在〜/ bin中,并确保〜/ bin在PATH中。然后你可以全局访问你的变量。这只是我用来编译Go源代码的一个例子,它需要GOPATH变量指向当前目录(假设您位于需要编译源代码的目录中):

From〜/ bin/GOPATH:

#!/bin/bash 

echo declare -x GOPATH=$(pwd) 

然后你只需要做:

#> $(GOPATH) 

所以,你现在可以使用从其他脚本中的$(GOPATH)也一样,如自定义生成脚本,它可以自动调用这个变量,由于$(pwd),即时声明它。