2014-09-05 62 views
0

我有一个bash脚本ex.sh调用另一个脚本path.sh导出变量到另一个bash脚本

sh path.sh 

我在path.sh一个变量,我想在ex.sh使用

我试图

export var 

,然后使用

echo 'export HOME=${var}' >> /etc/profile.d/user_env.sh 
0把它称为在ex.sh

这是行不通的,任何帮助非常感谢

+1

如果您希望进行扩展,则不能在此处使用单引号。 – 2014-09-05 21:54:37

+0

@jquerynoob你应该接受最适合你的答案,作为对其他花时间帮助你的人的礼貌。如果您不满意,随时可以在提供的答案上添加注释 – dganesh2002 2014-09-06 01:03:52

回答

2

export承认一个变量或函数的子壳。
相反,内ex.sh,的path.sh脚本像下面 - >

. ./path.sh 

或这样的 - >

source ./path.sh 

这样一来,所有声明的变量和路径的功能.sh在当前脚本中可用(在这种情况下为ex.sh)

如果path.sh除了声明变量和函数之外还做了一些其他工作,则还有一个单独的第三个脚本set_var.sh和sour在path.sh和ex.sh中都是这样的

+0

如果您希望'path.sh'(子进程)向调用方公开变量,这将是必要的。当所有必要的变量都被导出时 - 也就是说,当* environment *变量来自调用者对其子进程可见时,它不是必需的。 – 2014-09-05 21:59:55

+0

那么他可以使用第三个脚本来定制它,无论他想将它暴露给ex.sh – dganesh2002 2014-09-05 22:01:17

+0

(顺便说一句 - 如果我的回答中的downvote来自你,那么解释为什么以及内容如何不准确的评论将会是理解)。 – 2014-09-05 22:02:16

2

父进程不能从子进程获取变量。您应该在进程之间使用某种形式的通信来交换数据。您可以使用:

  • 文件
    • 孩子写信息到一个文件,如:newvar=someval
    • 当孩子退出,父source文件并获得newvar变量

  • 命名管道
    • 父创建一个FIFO
    • 在后台运行的孩子,从管道
    • 孩子开始读出的信息写入管
    • 家长阅读...

演示:

文件:parent.sh

commfile="./.ex.$$" 
echo "the newvar before child: =$newvar=" 
bash child.sh "$commfile" 
source "$commfile" 
echo "the newvar after source: =$newvar=" 
rm -f "$commfile" 

文件:child.sh

commfile="$1" 
#do something 
sleep 2 
echo "newvar='some value'" >"$commfile" 

运行parent.sh打印:

the newvar before child: == 
the newvar after source: =some value= 
相关问题