为了保持概览,我喜欢始终以相同的顺序放置多个命令并一起自动启动它们(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"'
其他答案中给出的解决方案有效,但有一些缺点:
- 如果您在运行Ctrl-C时按
cmd
,则会杀死外部进程,因为和sh
都只有一个进程组。sh
cmd
- 您不能使用Ctrl-Z暂停
cmd
- 与该
$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的cmd
。
答案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'"
这将为您提供以下信息:
答案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