在shell脚本之间导出变量

时间:2011-04-15 13:22:40

标签: bash shell scripting

我有两个独立运行的脚本。 第一个让我们说脚本A计算一些值。我想从其他名为B的脚本中回显这些值。这些脚本不会互相调用。我使用了export关键字但没有用。我怎么能这样做?

6 个答案:

答案 0 :(得分:6)

如果我理解了这个要求,那么两个脚本都不能简单地在同一个子shell中执行,而是没有相互调用或者不需要像这样的外部文件或管道:

假设这是您的 script1.sh

#!/bin/bash
# script1.sh: do something and finally
export x=19

我们这里是 script2.sh

#!/bin/bash
# script2.sh: read value of $x here
echo "x="${x}

只需在同一个子shell中调用它们

(. ./script1.sh && ./script2.sh)

<强>输出:

x=19

答案 1 :(得分:4)

 mkfifo /tmp/channel

 process_a.sh > /tmp/channel&
 process_b.sh < /tmp/channel&

 wait

当然,您也可以在需要时阅读一行。

在bash中有coprocs,也可能是你想要的。来自this page

的随机示例
# let the output of the coprocess go to stdout
{ coproc mycoproc { awk '{print "foo" $0;fflush()}' ;} >&3 ;} 3>&1
echo bar >&${mycoproc[1]}
foobar

ksh有类似的功能,显然是

答案 2 :(得分:1)

将每个脚本视为一个函数:函数A计算一些值并返回它。它不知道谁会打电话给它。函数B接受一些值并回显它。它并不关心谁产生了这个价值。所以,脚本A是:

#!/bin/sh
# a.sh: Calculate something and return the result
echo 19

和脚本B是:

#!/bin/sh
# b.sh: Consume the calculated result, which passed in as $1
echo The result is $1

让它们可执行:

chmod +x [ab].sh

现在,我们可以在命令行上将它们粘合在一起:

$ b.sh $(a.sh)
The result is 19

从语义上讲,b.sh没有调用a.sh.您调用了a.sh并将其结果传递给b.sh。

答案 3 :(得分:0)

你不能读取第三个文件,让我们说settings.sh与常见的导出变量?

# common.sh
export MY_PATH=/home/foo/bar/
export VERSION=42.2a

并在A和B source common.sh中加载这些值。

请注意,在这种情况下可能不需要导出。

答案 4 :(得分:0)

您可以将值回显给文件,然后其他脚本可以读取它们。如果你想将它用作某事物的参数,请使用反向注释:

echo `cat storedvalue`

请注意,如果两个脚本同时运行,可能会出现并发问题,这可能导致很少出现神秘的错误。

答案 5 :(得分:0)

实际上您需要source,您可以跳过export前缀。

我的用例是一个特定于环境的设置文件,例如:

main_script.sh

THIS_DIR=`dirname $0`
source $THIS_DIR/config_vars.sh
# other commands

config_vars.sh

LOCAL_ROOT="$HOME/folder/folder"
REMOTE_USERNAME='someuser'
BACKUP_FOLDER="$LOCAL_ROOT/folder"
# etc.