【问题标题】:How can I use variables set from a terminal shell script in a new terminal window or tab? (OSX)如何在新的终端窗口或选项卡中使用从终端 shell 脚本设置的变量? (OSX)
【发布时间】:2014-07-31 16:04:41
【问题描述】:

环境变量或变量的导出似乎对我不起作用...我看到已经涵盖了许多版本,但它们似乎非常具体,我感到困惑。

我正在 OSX 10.9 上创建我的第一个 shell 脚本。到目前为止,该脚本执行以下操作:

1) 向用户询问服务器ip地址、服务器端口、ssh登录用户名等变量等一系列问题。

2) 使用用户设置的变量,然后通过 ssh 连接到 linux box (ubuntu 14)。

3) ssh 连接后,终端启动一个名为iperf3 的程序,使用用户从脚本中指定的ipport 在服务器上运行。

到目前为止,所有这些步骤都有效。

问题在于,一旦 iperf 程序开始侦听脚本指定的端口,所有终端命令都会停止。为了在我的客户端上运行 iperf3,此时,我需要打开一个新选项卡或窗口,并手动运行命令。我宁愿让新选项卡从脚本中继续。

但是,即使我手动运行命令,终端中的这些新选项卡或窗口也不知道用户事先从脚本中设置的变量。我一直在尝试导出命令并研究设置环境变量,但我很困惑和迷失。

理想情况下,接下来的步骤将从我创建的一个脚本文件运行并继续执行以下操作:

4) 使用用户指定的ipport 创建新标签并启动iperf3

5) 将创建的--json 文件上传到在Linux 机器上运行的MySQL 数据库。

iperf,对于那些不知道的人,测试客户端和主机之间的网络带宽,并将结果发布到终端。我需要在许多不同的地方无线测试带宽,自动化大多数“复制粘贴”命令将节省大量时间。 任何帮助将不胜感激。

【问题讨论】:

    标签: linux macos bash ssh global-variables


    【解决方案1】:

    我知道在脚本之间传递数据的两个技巧:

    a) 使用一个包含数据的小文件,然后使用以下方法获取它: 写:

    echo $ip >> tmpfile
    echo $other_data >> tmpfile
    

    把它拿回来:

    var=$(cat tmpfile)
    # You'll get one value per line and you can use it with something like
    while read line
    do
        ##do some job...
    done < tmpfile
    

    b) 在行尾使用 '&' 来调用您不想等待的脚本,因此您不需要另一个选项卡或脚本...

    供进一步参考: http://www.tldp.org/LDP/abs/html/index.html

    【讨论】:

    • 感谢您的回答。为了弄清楚这一点,您将变量输出到临时文件,然后在新窗口中加载临时文件?我可以看到我的变量被添加到临时文件中(有欺骗但不是真正的问题)。但它仍然不读取变量。例如: 'S_IP=192.168.1.12' 'echo "S_IP="$S_IP >> tmp1 #from script' '#new window' 'var=$(cat tmpfile)' 'echo $S_IP' '#comes back blank' ' 我必须使用 while read 行吗?抱歉,我正在尝试在此处格式化评论,但事实证明这是一个挑战。 =[
    • 现在,我正在根据您在桌面上给我的信息创建一个临时文件,该文件写出运行 iperf3 的新代码。我只需要让脚本自动打开一个新选项卡并加载 temp.sh 文件即可执行命令。
    • 是的:我将这些值放在一个临时文件中。可能更容易按照您要阅读的顺序简单地编写值:
    • 是的:我将这些值放在一个临时文件中。也许更容易简单地按您要阅读的顺序写入值:#this is important to clear the file... or just use '&gt;' instead of '&gt;&gt;' the first time you write to the file... touch tmp1 S_IP=192.168.1.12 echo $S_IP &gt;&gt; tmp1 S_Other=theuser echo $S_Other &gt;&gt; tmp1 ... 当您阅读时,您知道第一行是 S_IP,第二行是 S_Other,依此类推...逐行阅读使用:while read line #remember that line is a variable... do some=$line done &lt; tmp1
    • 根据您的笔记,我能够让它工作。太感谢了。 echo "#!/bin/bash" &gt; /Users/$USER/Desktop/temp.shopen -a Terminal.app /Users/$USER/Desktop/temp.shecho "iperf3 -c "$S_IP -p $S_PORT &gt;&gt; /Users/$USER/Desktop/temp.shchmod 700 /Users/$USER/Desktop/temp.shiperfServer #this runs the iperf3 server listening.
    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 2013-11-18
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2013-08-04
    相关资源
    最近更新 更多