如何制作一个可以打开终端窗口并在其中执行命令的脚本?


140

启动Ubuntu计算机时,我需要运行三个脚本,它们启动了我在开发环境中使用的服务。

为此,我手动打开三个终端并输入命令。

有什么方法可以创建一个脚本,该脚本将打开三个终端并在每个终端中执行一个命令?(每个命令应该在单独的终端窗口中,以便我可以看到它们的输出)。

Answers:


138
gnome-terminal -e command

要么

xterm -e command

要么

konsole -e command

差不多

terminal -e command

要在命令退出时保留终端:

konsole中有一个--noclose标志。

在xterm中,有一个-hold标志。

在中gnome-terminal,转到编辑 -> 配置文件首选项 -> 标题。单击命令选项卡。从标记为命令退出时的下拉菜单中选择保留终端。您应该为此创建一个新的配置文件并执行

gnome-terminal --window-with-profile = NAMEOFTHEPROFILE -e 命令

1
如果我尝试握住终端机,则会收到“子进程正常退出,状态代码为127”
Darshan Chaudhary

2
GNOME终端没有标题的选择更多:(
törzsmókus

1
@törzsmókus确实是2017年!LTS版本具有5年的支持寿命。14.04直到2019年4月才结束。wiki.ubuntu.com/Releases
bhass17年

1
gnome-terminal -e command仅在command引用时起作用。因此这行不通:gnome-terminal -e "echo hello world; sleep 3"但这行之有效gnome-terminal -e "bash -c 'echo hello world; sleep 3'"。叹。
bgoodr '17

3
您还可以通过添加; $SHELL到命令末尾来保持gnome-terminal打开。例:gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"
加布里埃尔·斯台普斯

58

而不是硬编码的gnome-terminalkonsole,等等,使用替代系统。执行默认终端仿真器的程序是:

x-terminal-emulator

在我的系统上,每当我执行此命令时,它将打开Konsole的新实例。

幸运的是,终端似乎支持-e执行命令的选项(我为konsole和验证了此选项gnome-terminal)。命令后的参数传递给调用的命令。Bash拒绝在我的终端机中保持打开状态,需要另一个脚本才能获得终端机:

#!/bin/sh
"$@"
exec "$SHELL"

如果将以前的脚本另存为/home/user/hacky并使其可执行,则可以使用以下命令运行脚本:

x-terminal-emulator -e /home/user/hacky your-script optional arguments here

完整路径是必需的,/home/user/hacky并且必须是可执行的。

我以前在新的终端窗口中运行脚本的尝试可以在版本2中找到,那是在我意识到可以将参数传递给之前x-terminal-emulator


在这种情况下,这将无济于事,因为发问者想要对所有终端进行不同的操作。
nickguletskii

尝试#3:这应该保持终端打开并运行带有可选参数的程序。
Lekensteyn 2011年

1
我使用了gnome选项,但是一旦运行脚本,主终端就会关闭!..知道为什么吗?
McLan 2015年

3
@ Suda.nese这是设计使然,当“终端”执行完脚本后,它将退出,因为没有更多要做。您可以通过调用可在其中执行命令(bash)或包含诸如的行的shell来“修复”此问题read -p "Press Return to continue"
Lekensteyn

1
您如何在终端中运行多个命令?例如cd xxx && start.sh。解释器将&&视为命令的第二部分(这是逻辑上的),但是如果我引用它,则它将尝试将整个内容作为一个大参数执行
理查德(Richard)

9

很简单-

#!/bin/bash

/etc/init.d/ccpd status

这对于不需要在终端中显示任何内容的其他命令就足够了。但是这里必须看到显示的状态。
因此,它需要在终端窗口中运行

#!/bin/bash

gnome-terminal -e "/etc/init.d/ccpd status"  --window-with-profile=NAMEOFTHEPROFILE

另一个打算[]用作占位符的职位

在此,“ NAMEOFTHEPROFILE”将替换为“命令退出时保留终端”的配置文件名称。

在此处输入图片说明

在此处输入图片说明


1
我认为@cipricus []只是占位符
Karthik T

得到它了。但我必须使终端不要关闭得这么快。我想这也是链接的问题

@cipricus您是否尝试过配置文件一个?只需补充--window-with-profile=NAMEOFTHEPROFILE我提供的内容
Karthik T

1
@cipricus我必须回到家才能给出更好的说明,但是这个想法是使用该选项集创建一个特殊的配置文件,并在上面的位置使用特殊配置文件的名称。
Karthik T

2
@cipricus如果这对您来说足够,那就可以了。配置文件仅是一组设置。您可以仅在脚本中使用设置设置,而不必在所有终端中使用它。你可以看到编辑- >配置文件,看看你有配置文件,就可以新增一个有这是建立在您链接后解释
KARTHIK牛逼

5

@nickguletskii的回答以及他的回答下我自己的评论的帮助下,并受到@grabantot对我的评论的支持,这是我的首选方式,尤其是当我希望终端保持打开状态以便可以手动使用它时。

例如 用法:将其添加到启动程序中非常有用,因此该脚本将运行,打开终端,在终端中创建并命名标签并为您运行命令。或者,您可以仅将此脚本的符号链接添加到桌面。我使用这种方法,因此我可以双击桌面上的一个图标,然后打开一堆终端(根据我要在其中进行的工作来命名各种标签)和程序来设置我的编程环境,例如日常工作。

这是一个人为的示例,它打开一个选项卡,将其命名为“ test”,然后在其中运行简单的命令cd /etc; ls。最后的$SHELL部分将强制外壳保持打开状态,以便您可以随后查看其输出并继续使用它(我在Stack Overflow的其他地方了解到了这一点):

gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"

这是一个更复杂的示例,该示例在同一gnome终端中打开3个单独的选项卡。这正是我的桌面快捷方式所做的事情,因此我可以立即打开一堆编程窗口:

gnome-terminal --tab --title="tab 1" --command="bash -c 'cd /etc; ls; $SHELL'" --tab --title="tab 2" --command="bash -c 'cd ~; ls; $SHELL'" --tab --title="tab 3" --command="bash -c 'cd ~/temp3; ls; $SHELL'"

这是上述命令的分解:

  • gnome-terminal =打开一个gnome终端
  • --tab =打开一个唯一的选项卡以备接下来使用
  • --title="tab 1" =将此标签命名为“标签1”
  • --command="bash -c 'cd /etc; ls; $SHELL'"=运行bash -c 'cd /etc; ls; $SHELL'命令,这只是我作为示例编写的命令;它的作用是:
    • bash -c 说这是一个bash'c'manmand
    • cd /etc ='c'hange'd'irectory进入“ / etc”路径
    • ls =“ l”不是此目录的内容
    • $SHELL=要使外壳保持打开状态,需要使用此秘密消息,以便您可以使用它。如果要打开外壳,请运行命令,然后关闭,只需删除此部分。但是,我希望选项卡保持打开状态,以便使编程变得神奇。:)
  • 然后,我们从该--tab部分重新开始以生成选项卡2,然后再次生成选项卡3。根据您的内心需求进行自定义。

屏幕截图:

在此处输入图片说明


1
很高兴为您提供帮助),我也有一些脚本,可以单击它们并开始从事该项目。它们有两个问题:许多终端窗口(它们有一个单独的屏幕)和例如在服务器崩溃后关闭的窗口。这个答案解决了--tab + $ SHELL的两个问题。尼斯
汉普顿18'Dec 12'31

1

评论Lekensteyn的答案。我知道这是一篇过时的文章,但是对于任何认为这很有用的人(就像我刚才所做的那样),您只需在脚本中放入一个函数就可以制作另一个“ hacky脚本”

hacky_function()
{
"$@"
exec "$SHELL"
}

使用“ x-terminal-emulator -e / path / to / script hacky_function可选参数在此处调用”脚本

不要忘了在脚本末尾添加“ $ @”


-2

使用screen命令,并-d与现有的屏幕会话分离,然后在此处重新附加-m强制新的屏幕会话-S创建一个命名会话,而不使用默认名称


这个答案根本不清楚,请注意使其更易理解
azerafati

@azerafati的确,屏幕无法打开任何终端窗口...甚至那个超棒的包都不打算...
erm3nda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.