Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在shell脚本中将变量从一个脚本传递到另一个脚本_Unix - Fatal编程技术网

Unix 在shell脚本中将变量从一个脚本传递到另一个脚本

Unix 在shell脚本中将变量从一个脚本传递到另一个脚本,unix,Unix,我有一个脚本假设script.sh 它有两个脚本在内部以视差方式运行 sh script1.sh & sh script2.sh & wait; echo $var1 echo $var2 我想在运行script.sh时打印这两个变量var1和var2 cat script1.sh var1=1; export $var1 cat script2.sh var1=1; export $var1 想到的事情: 如果使用bash,则可以使用点运行脚本: .script1.s

我有一个脚本假设script.sh 它有两个脚本在内部以视差方式运行

sh script1.sh &
sh script2.sh &
wait;
echo $var1
echo $var2
我想在运行script.sh时打印这两个变量var1和var2

cat script1.sh

var1=1;
export $var1

cat script2.sh

var1=1;
export $var1

想到的事情:

如果使用bash,则可以使用点运行脚本:

.script1.sh

它将在相同的环境中运行脚本,所以您可以修改调用器脚本的环境变量

如果是单个输出数据,则可以打印到内部脚本的标准输出中,并在外部脚本中截取:

内部_结果=`script1.sh`

如果它是一个数值,您可以将其作为脚本的退出代码返回,但我不建议使用这种方法,因为这在脚本开发中是一种不好的做法

编辑:

使用临时文件存储结果,然后将其删除,但根据操作系统的不同,命名队列可能是最好的专用解决方案
如果脚本1和脚本2将其变量写入标准输出,则可以使用bash 4.x中的协进程执行此操作:

#!/usr/bin/env bash
#              ^^^- Must be bash, not /bin/sh; must NOT start this script with "sh name".

start_seconds=$SECONDS
run_script1() { sleep 5; echo "one"; }  # replace these with your script1 or script2
run_script2() { sleep 5; echo "two"; }

coproc coproc_script1 { run_script1; }
coproc coproc_script2 { run_script2; }

read -u "${coproc_script1[0]}" var1
read -u "${coproc_script2[0]}" var2
echo "End time: $(( SECONDS - start_seconds )); var1=$var1; var2=$var2"

如果这些值没有并行运行,则结束时间将为10或更多。相反,对于上面的代码,它实际上应该是5或6。

是否严格定义了它应该在哪个shell解释器/操作系统上运行,或者解决方案应该是可移植的?unix bashshell@mpasko256Is“这不是问题的某种重复吗?该方法不起作用,因为我正在使用&,运行script1和script2。”,两者都将在后台运行UNIX没有说任何有用的话。只在Linux上运行或只在Linux和MacOS上运行的东西与同样需要在Solaris、HPUX、IRIX和AIX上运行的东西之间有很大的区别。script1.sh和script2.sh都返回单个输出数据。但两者必须同时触发,val1和val2应该在等待后打印,因为callI没有满足脚本需要并行运行的要求,所以添加了第四个解决方案。如果您只需要bash 4.x支持,我建议使用协进程。顺便说一句,由于1-2根本不能解决这个问题,而3需要通过单独的PID来等待将退出状态与他们联系起来,因此我建议对这个答案进行大量修改。