【问题标题】:passing variable from one script to another in shell scripting在 shell 脚本中将变量从一个脚本传递到另一个脚本
【发布时间】:2017-11-07 19:24:01
【问题描述】:

我有一个脚本假设 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

【问题讨论】:

  • 是否严格定义了它应该在哪个 shell 解释器/操作系统上运行,或者解决方案应该是可移植的?
  • unix bash shell@mpasko256
  • 这不是*.com/questions/42067435/…问题的某种重复吗?
  • 该方法不起作用,因为我正在运行带有 & 的 script1 和 script2,两者都将在后台运行
  • "UNIX" 没有说任何有用的东西。只在 Linux 上运行的东西,或者只在 Linux 和 MacOS 上运行的东西,与也需要在 Solaris、HPUX 和 IRIX 和 AIX 上运行的东西之间存在很大差异。

标签: unix


【解决方案1】:

如果您的 script1script2 将它们的变量写入标准输出,这可以通过 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"

如果这些值没有并行运行,您的 End time 将是 10 或更多。相反,它实际上应该是56 与上述代码。

【讨论】:

    【解决方案2】:

    想到的事情:

    1. 如果你使用 bash,你可以使用点来运行脚本:

      .script1.sh

      它将在同一环境中运行脚本,因此您可以修改“invoker”脚本的环境变量。

    2. 如果是单条输出数据,直接打印成内层脚本的标准输出,在外层脚本中截取即可:

      inner_result=`script1.sh`

    3. 如果是数值,可以作为脚本的退出码返回(但不推荐这种方式,在脚本开发中是不好的做法)

    编辑:

    1. 使用临时文件存储结果然后将其删除(但取决于操作系统,命名队列可能是最好的专用解决方案)

    【讨论】:

    • script1.sh 和 script2.sh 都返回单个输出数据。但两者都必须一起触发,val1 和 val2 应该在等待调用后打印
    • 我错过了脚本需要并行运行的要求,所以添加了第四个解决方案
    • 如果您只需要 bash 4.x 支持,我实际上建议使用协同进程。顺便说一句,由于 1-2 根本没有解决问题,而 3 需要将各个 PID 传递给 wait 以将退出状态与它们联系起来,我建议对这个答案进行大量修改.