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