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

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

为了保持概览,我喜欢始终以相同的顺序放置多个命令并一起自动启动它们(gradle、git、数据库、scala-REPL、jboss...)

-H(hold)似乎意味着终止后终端不关闭,但是如何故意终止这样的进程?一点也不?这样我就可以继续使用终端了。

我正在将 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 它是有效的,因为它是列表中的最后一个命令。

答案1

-H/-hold选项是在终端仿真器窗口中启动的应用程序(shell 或其他)退出后保持终端仿真器窗口打开。在那种状态下,不会再发生任何事情了。

如果您想在 xfce4-terminal 终端仿真器中启动命令作为交互式 shell 的作业,并保持 shell 运行并在应用程序退出后以交互方式使用它,则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 \
  ...

这样,命令就是工作该 shell 的,这意味着您可以暂停它们Ctrl-Z并稍后恢复它们,fg/bg就像您在该交互式 shell 的提示符下输入它们一样。

假设您没有在$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-C时按cmd,则会杀死外部进程,因为和sh都只有一个进程组。shcmd
  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 CONTPIDcmd

答案2

据我理解你的问题,你想在终端中运行一些进程,能够Ctrl+C它们,然后使用 shell 保持窗口打开。

如果我是对的,这可以通过如下命令来完成:

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

答案3

xfce4-terminal选项卡中的多个应用程序

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

Ctrl+C如果/当您使用选项卡时,您可以使用此技巧添加 shell :

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

这将为您提供以下信息:

   带选项卡的 xfce 的 ss

   xfce 的 ss 带顶部 Ctrl+C

答案4

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

我认为您正在尝试实现您刚刚启动终端并且开发环境启动的情况?

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

#!/bin/sh

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

$SHELL

# some cleanup commands if needed

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

如果你想让它们保持活力,请nohup jboss &在你的脚本中使用eg

相关内容