如何在每个选项卡上使用不同的命令运行xfce-terminal,并在命令返回后继续使用这些选项卡?


20

为了保持概述,我希望始终以相同的顺序放置多个命令并自动一起启动它们(gradle,git,database,scala-REPL,jboss ...)

-H(保持)似乎意味着终端在终止后没有关闭,但是我如何故意终止该过程?一点也不?这样我就可以继续使用终端了。

我正在将xubuntu与xfce4-terminal和bash一起使用。是否有更好的GUI解决方案来启动多个命令,并能够继续在该窗口/选项卡中工作?

更新:如果您不知道这些命令:Jboss和gradle会不断产生输出,您不想在同一终端中混在一起。有时它们需要用^ C中断,然后重新启动。我不喜欢重新打开xfce4-term并导航到需要执行操作的目录。

数据库和scala-REPL是交互的,因此在后台启动它们是没有意义的。

我当前的启动脚本只是导航到所需的目录,并以正确的顺序打开所有选项卡,以使它们始终位于同一位置,并为其目的命名每个选项卡:

xfce4-terminal -T eclipse   --working-directory=/home/stefan/oximity -e "/opt/eclipse/eclipse" \
    --tab -T arandr --working-directory=/home/stefan/oximity -e "arandr /home/stefan/.screenlayout/oximity.sh" \
    --tab -T bash       --working-directory=/home/stefan/oximity \
    --tab -T gradle     --working-directory=/home/stefan/oximity/med \
    --tab -T git        --working-directory=/home/stefan/oximity/med \
    --tab -T mysql      --working-directory=/opt/mini/mysql \
    --tab -T jboss      --working-directory=/opt/mini/jboss \
    --tab -T jboss-log  --working-directory=/opt/mini/jboss/standalone/log \
    --tab -T scala-REPL --working-directory=/home/stefan/proj/mini/forum -e /opt/scala/bin/scala

Eclipse和arandr与shell分离并在它们自己的窗口中运行,因此-e(执行)参数有效。我认为对于scala-REPL来说它是有效的,因为它是列表中的最后一个命令。


我仍然不清楚您的问题。您是否希望终端在启动命令时终止后恢复为Shell?像xterm -e 'stuff;bash'什么?
弗罗斯特斯

1
这个问题仍然需要工作!我找到了这个线程,我认为这是OP所寻找的:如何保持xfce4-terminal打开?。他想知道如何访问已使用“ -H”开关的选项卡,并继续将其用作普通终端窗口。OP,您能否确认我是否正确?
slm

@slm:是的,我想保持终端打开以处理其他命令-我只想自动启动我的第一个命令,并具有多个命名标签。
用户未知,

Answers:


21

-H/-hold选项是保持终端仿真器窗口中打开,一旦应用程序在它(壳或其他方式)启动已退出。在那种状态下,什么也不会发生。

如果要在xfce4-terminal终端仿真器中以交互式外壳程序的身份启动命令,并保持外壳程序运行并在应用程序退出后以交互方式使用外壳程序,请使用bash,可以使用$PROMPT_COMMAND环境变量xfce-terminal启动一个交互式shell,它在第一个提示之前启动给定命令。

xfce4-terminal \
  -T eclipse \
  --working-directory=/home/stefan/oximity \
  -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; /opt/eclipse/eclipse" bash' \
  \
  --tab -T arandr \
  --working-directory=/home/stefan/oximity \
  -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; arandr /home/stefan/.screenlayout/oximity.sh" bash' \
  \
  --tab -T bash \
  --working-directory=/home/stefan/oximity \
  ...

这样,命令就是该外壳程序的作业,这意味着您可以将其挂起,Ctrl-Z然后再恢复它们,fg/bg就像您在该交互式外壳程序的提示符下输入它们一样。

前提是您未在$PROMPT_COMMAND中设置~/.bashrc。另请注意,该命令的退出状态在中将不可用$?

为了使它更像在shell提示符下输入命令,您甚至可以将其添加到历史记录列表中。喜欢:

xfce4-terminal -T /etc/motd -e 'env PROMPT_COMMAND="
  unset PROMPT_COMMAND
  history -s vi\ /etc/motd
  vi /etc/motd" bash'

这样,一旦退出vi,您可以Up按键来调用同一vi命令。

一种更简单的编写方式:

PROMPT_COMMAND='unset PROMPT_COMMAND; history -s "$CMD"; eval "$CMD"' \
  xfce4-terminal --disable-server \
          -T /etc/motd -e 'env CMD="vi /etc/motd" bash' \
    --tab -T       top -e 'env CMD=top bash'

该:

xfce4-terminal -e 'sh -c "cmd; exec bash"'

其他答案中给出的解决方案有效,但有一些缺点:

  1. 如果Ctrl-Ccmd运行时按,则会杀死外部,sh因为sh和都只有一个进程组cmd
  2. 你不能Ctrl-Z用来暂停cmd
  3. 与该$PROMPT_COMMAND方法一样,该命令的退出状态将在中不可用$?

您可以通过执行以下操作来解决以上1个问题

xfce4-terminal -e 'sh -c "trap : INT; cmd; exec bash"'

要么:

xfce4-terminal -e 'sh -ic "cmd; exec bash"'

使用后一个,您还可以通过暂停该过程Ctrl-Z,但是您将无法使用fg/bg它。您可以通过kill -s CONT在的pid上执行a来在后台继续执行此操作cmd


哇。那是相当复杂的,但似乎可行。:)我不知道为什么奖励消失了。不幸的是,我还没来得及测试提示。
用户未知

我不太了解赏金制度的所有规则。由于我认为您应该得到赏金,因此我重新开始了新的赏金活动。
用户未知

是的,赏金会在7天后过期,您有24小时后才能奖励。如果您不知道它们,他们将被分配给具有最高代表(2或更高)的任何用户。下面是更多的比你想要了解的恩泽8):meta.stackexchange.com/questions/16065/...
SLM

1
@AdrianLopez,在bash脚本中根本没有历史记录,因为除非您read -e在脚本中使用,否则就没有行编辑或用户交互(并且您会在那看到它的history -s text工作历史,以充实该历史记录read -e)。在这里,我们不是history -s从脚本运行,而是从$PROMPT_COMMAND交互式外壳程序的钩子运行。
斯特凡Chazelas

1
@StéphaneChazelas太神奇了。遵循您在此处提出的其他有价值的答案后,我必须补充一点,xfce4-terminal因为至少在0.6.3版中现在需要一个额外的参数- --disable-server通过环境。参考:lists.debian.org/debian-user/2017/10/msg00045.html
ジョージ

5

据我了解您的问题,您希望在终端中运行某些进程,以便能够对其进行Ctrl+处理C,然后再使用shell保持窗口打开。

如果我是对的,可以使用以下命令来完成:

xfce4-terminal -e "bash -c 'COMMAND; exec bash'"

它可以与多个标签一起使用吗?
不明的使用者,

@userunknown当然。只需在其他命令之前添加--tab即可。例如,如果要运行“ ls / etc”和“ ls / dev”,则将发出:xfce4-terminal -e“ bash -c'ls / etc; exec bash'” --tab -e“ bash- c'ls / dev; exec bash'“如果使用Gnome Terminal,则还必须在第一个命令之前编写--tab。
拉斐尔·卡瓦尔坎蒂

这有点帮助,但没有达到我的期望。当我使用xfce4-terminal --working-directory = / home / stefan / oximity / med -e“ bash -c'gradle explodedWar explodedWarSync; bash'”启动gradle时,将打开一个选项卡,命名为,但它显示“ gradle:找不到命令”,在此输入命令的效果很好。Git,mysql和scala可以很好地工作,但是对于jboss,Ctrl-C终止整个jboss-tab。我只能准备从那里开始的外壳-也许回显命令以进行输入。我真的不明白是什么造成了这里的差异。
用户未知

1

xfce4-terminal标签中有多个应用

向每个xfce选项卡添加交互式shell

如果/在Ctrl+C使用标签时,可以使用此技巧添加外壳:

$ xfce4-terminal -H \
     --tab -T bash -e "bash -c 'top;bash'" \
     --tab -T git  -e "bash -c 'top;bash'"

这将为您提供以下内容:

   带选项卡的xfce ss

   带顶部Ctrl + C的xfce的ss


0

退出外壳时,没有-H端子的外壳也将关闭。使用此标志,终端将继续运行,但是shell进程已关闭并且无法恢复。

我认为您是想归档一下您只是启动终端并启动开发环境?

您可以创建一个Shell脚本,并将所有命令放入其中。在脚本末尾,您只需启动shell:

#!/bin/sh

gradle &
git &
... &
.... &
jboss &

$SHELL

# some cleanup commands if needed

然后通过调用此脚本xfce4-terminal -e /the/script。从$SHELL父进程(您的脚本)退出时,后台任务将收到退出信号并退出。

如果要保持它们的生命,请nohup jboss &在脚本中使用例如


那是行不通的,因为gradle和jboss会永久产生输出。您不希望让它们混淆它们的输出。数据库和scala终端是交互式的。将它们置于后台是没有意义的。在不同选项卡中打开其他命令的想法是,历史记录只填充了针对一个主题的几个不同命令,因此可以快速浏览。
用户未知,
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.