【问题标题】:Avoid gnome-terminal close after script execution?脚本执行后避免 gnome-terminal 关闭?
【发布时间】:2011-03-31 12:51:28
【问题描述】:

我创建了一个 bash 脚本,它可以打开几个 gnome 终端,通过 ssh 连接到教室计算机并运行一个脚本。

如何避免 gnome-terminal 在脚本完成后关闭?请注意,我还希望能够在终端中输入更多命令。

这是我的代码示例:

gnome-terminal -e "ssh root@<ip> cd /tmp && ls"

【问题讨论】:

标签: linux bash shell ssh


【解决方案1】:

据我了解,您希望 gnome-terminal 打开,让它执行一些命令,然后放到提示符处,这样您就可以输入更多命令。 Gnome-terminal 不是为此用例设计的,但有一些解决方法:

让 gnome-terminal 运行 bash 并告诉 bash 运行你的命令,然后运行 ​​bash

$ gnome-terminal -e "bash -c \"echo foo; echo bar; exec bash\""

最后的exec bash 是必要的,因为bash -c 将在命令完成后终止。 exec 导致正在运行的进程被新进程替换,否则您将有两个 bash 进程在运行。

让 gnome-terminal 使用准备好的 rcfile 运行 bash,该 rcfile 会运行您的命令

准备somercfile:

source ~/.bashrc
echo foo
echo bar

然后运行:

$ gnome-terminal -e "bash --rcfile somercfile"

让 gnome-terminal 运行一个脚本,该脚本运行你的命令,然后放到 bash

准备scripttobash:

#!/bin/sh
echo foo
echo bar
exec bash

将此文件设置为可执行文件。

然后运行:

$ gnome-terminal -e "./scripttobash"

您也可以创建一个genericscripttobash:

#!/bin/sh
for command in "$@"; do
  $command
done
exec bash

然后运行:

$ gnome-terminal -e "./genericscripttobash \"echo foo\" \"echo bar\""

每种方法都有它的怪癖。你必须选择,但要明智地选择。我喜欢第一个解决方案的冗长和直截了当。

说了这么多,这可能对你有用:http://www.linux.com/archive/feature/151340

【讨论】:

  • 可能值得注意的是,rcfile 解决方案允许在获取 `.bashrc` 文件后运行命令,而其他选项均不允许您执行这样做。
  • 虽然这很疯狂,但我很高兴偶然发现了这篇文章。我有一个脚本在配置文件中使用了“Hold”方法,而白痴不断点击弹出的重新启动按钮并导致问题!
【解决方案2】:

最后这个对我有用:

gnome-terminal --working-directory=WORK_DIR -x bash -c "COMMAND; bash"

【讨论】:

    【解决方案3】:
    • 堆栈溢出答案:终端在其内部运行的命令完成后关闭,因此您需要编写一个不会立即终止的命令。例如,要让终端窗口保持打开状态,直到您在其中按 Enter

      gnome-terminal -e "ssh host 'cd /tmp && ls'; read line"
      
    • Super User 回答:创建一个配置文件,其中首选项“标题和命令/命令退出时”设置为“保持终端打开”。使用 --window-with-profile--tab-with-profile 选项调用 gnome-terminal 以指定终端名称。

    【讨论】:

    • 这个想法有帮助,但没有达到我想要的效果。如上所述,我将在终端中自动执行一些命令。执行后,我将能够手动输入一些命令。过去我手动(复制/粘贴): 1. ssh root@ 2. cd /root/install && ./WriteImage.sh && InitImage.py 3. 第 2 行.我用手抄到20台电脑的20台终端。我不能自动执行第 1 步和第 2 步,还可以像第 3 步一样手动输入其他命令吗?
    • --window-with-profile' (which opens separate terminals) or --tab-with-profile`(在单个终端中打开选项卡)的问题是,一旦脚本在选项卡/窗口中完成运行,或者当我按下 @987654330 @,选项卡/窗口立即关闭。我不希望它关闭。我希望该选项卡保持打开状态并显示 bash 提示符,以便我可以继续在该选项卡的 bash 提示符中键入命令。这不可能吗? read line 只暂停用户输入,这不是我想要的。任何帮助将不胜感激。
    • @Nav 这是一个不同的问题:您想让 shell 保持打开状态,而不是终端。我敢肯定之前有人问过,可能是在Super UserUnix & Linux 而不是Stack Overflow,因为这不是编程问题(但也可能在Stack Overflow 上)。
    【解决方案4】:

    使用-ic 而不是-i 运行以在您关闭终端 gui 时使终端关闭 bash 进程:

    gnome-terminal -e "bash -ic \"echo foo; echo bar; exec bash\""
    

    【讨论】:

      【解决方案5】:

      理想的解决方案是通过 echo "Press any key" 请求用户输入。

      但如果在 Nautis 或 Nemo 中双击并选择在终端中运行,它似乎不起作用。

      Ubuntu 的情况下,使用了为快速启动和执行而设计的仅具有标准功能的 shell,我相信它命名为 dash。 因此,shebang 是启用正确使用 bash 功能的第一行。 通常这将是:#!/bin/bash 或类似的。 在 Ubuntu 中,我了解到这应该是:#!/usr/bin/env bash。

      存在许多变通方法来在解释器发现 bash 命令中的语法错误之前保持屏幕。

      Ubuntu 中对我有用的解决方案:

      #!/usr/bin/env bash
      
      your code
      
      echo Press a key...
      read -n1
      

      【讨论】:

        【解决方案6】:

        截至 2020 年 1 月,gnome-terminal 中的 -e 选项仍然可以正常运行,但会抛出以下警告:

        对于-e

        # 选项“-e”已弃用,可能会在以后的版本中删除 gnome 终端。

        # 使用“--”终止选项并将命令行放入 在它之后执行。

        基于以上信息,我确认您可以运行以下两个命令而不会收到任何警告消息:

        $ gnome-terminal -- "./scripttobash"
        
        $ gnome-terminal -- "./genericscripttobash \"echo foo\" \"echo bar\""
        

        我希望这可以帮助目前遇到此问题的其他人:)

        【讨论】:

          【解决方案7】:

          对于适用于任何终端的解决方案,有一个脚本可以打开终端,运行指定的命令并在新终端中返回提示:

          https://stackoverflow.com/a/60732147/1272994

          【讨论】:

            【解决方案8】:

            我真的很喜欢 bash --rcfile 方法

            我只是 source ~/.bashrc 然后将我想要的命令添加到新的 startrc.sh

            现在我的自动 start.sh 工作环境已经完成......暂时 ?

            【讨论】:

            • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
            【解决方案9】:

            如果运行 bash 脚本,只需将 gedit afile 添加到脚本末尾,这将使 gnome-terminal 保持打开状态。 “afile”可能是一个构建日志,就我而言。

            没有尝试单独使用gedit,但这也可以正常工作。

            【讨论】:

              【解决方案10】:

              使用nohup 命令。

              nohup gnome-terminal -e "ssh root@ cd /tmp && ls"
              

              希望这会对你有所帮助。

              【讨论】:

              • 窗口仍然立即关闭。
              • 或许你应该使用 nohup 来启动主脚本?
              • 我看不出 nohup 在这里有什么帮助。
              • nohup 与 OP 的要求相反。
              猜你喜欢
              • 2013-09-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多