【问题标题】:Shell script statements not running one after oneShell 脚本语句没有一个接一个地运行
【发布时间】:2012-06-01 05:55:49
【问题描述】:

我编写了一个 shell 脚本,它在一个新的终端窗口中调用其他一些 shell 脚本。它在我的电脑上运行良好。是这样的

#!/bin/sh
gnome-terminal -e "sh one.sh"
zenity --info --text "exed one"
gnome-terminal -e "sh 2.sh"
zenity --info --text "exed 2"
firefox "www.aurl1.com" "www.aurl2.com"

据我了解,该脚本将首先打开一个终端并运行第一个脚本,完成后它将显示zenity然后在新终端中运行两个然后显示zenity。但是当在另一台计算机上执行相同的脚本时,脚本不遵循此顺序。它只是并排打开所有终端,而不是等待一个完成并一起显示对话。为什么会出现这个问题?提前致谢。

【问题讨论】:

  • “但是当在另一台计算机上执行相同的操作时”(它不起作用)。您是否绝对确定两台机器上的#!/bin/sh 相同。如果您发现不同之处,请考虑使用两台计算机的 uname -a 输出来编辑您的问题。祝你好运。
  • yes #!/bin/sh 在两台机器上是相同的,从同一个 iso 安装。
  • 我也将它安装在具有相同 iso 的虚拟机上......脚本也显示同样的问题......

标签: linux shell gnome-terminal zenity


【解决方案1】:

过去gnome-terminal 会在自己的进程中运行每个终端。但是现在gnome-terminal 在启动时检查是否已经有一个gnome-terminal 进程正在运行,如果是,则告诉现有的终端进程使用给定的参数打开一个新窗口。您的脚本没有问题:它正在等待每个进程依次完成,只是gnome-terminal 在将其工作传递给另一个进程后立即退出。

根据man gnome-terminal,您可以使用--disable-factory 选项禁用此行为,并在自己的进程中运行每个命令。

试试这个:

gnome-terminal --disable-factory -e 'sh -c "echo hi && sleep 10"'
echo now you can run script 2

【讨论】:

    【解决方案2】:

    像这样运行它们:

    gnome-terminal -e "sh one.sh" ; zenity --info --text "exed one" ; gnome-terminal -e "sh 2.sh" ; zenity --info --text "exed 2"
    

    逗号的作用是告诉 shell 执行第一个命令,等待它完成,然后才继续执行下一个命令。否则,您描述的行为是正常的,它会逐行解析,无需等待任何内容。

    【讨论】:

    • It didn't work意味着,我写了一个类似于我上面给出的脚本,该脚本应该首先执行第一个语句,等待完成,然后执行第二个语句,然后是第三个在第二个完成后......但它不是那样工作..第一个脚本开始了,然后第二个开始没有完成第一个..第三个开始没有第二个完成..不管给半冒号
    • 我已经在脚本中给出了命令 firefox "" "",只有在上面的所有语句都完成后才应该打开。但是,只要脚本运行,firefox 就会打开。
    • 你有没有像我建议的那样把所有的东西都放在同一行,中间加分号? (除了shebang - #!/bin/sh - 它应该是独立的,在第一行)。还是它们仍然在不同的行中,末尾有一个分号?
    • 不,我很确定这些东西,因为我提到过,它在我的电脑上运行良好
    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 2018-08-12
    • 2013-04-18
    • 2021-05-04
    • 2021-05-22
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多