如何通过终端干净地启动 GUI 应用程序?

如何通过终端干净地启动 GUI 应用程序?

有些 GUI 应用程序可以通过终端命令行顺利启动,但有些则不然,它们会导致终端等待应用程序终止。即便如此,有些也不会“释放”命令行。

神秘的“&”&后缀似乎会导致终端将进程置于后台(但我不确定那里发生了什么)。

有没有办法通过终端启动应用程序,这样就不会出现“挂起”效果,就像通过Alt+启动某个应用程序一样F2

我希望命令行能够立即再次可用,而不是在后台保留某些内容并在终端中打印。

答案1

假设gedit您想要以分离方式运行程序(又称“分离”、“解开”、“解耦”)。根据您想要执行的具体操作,有不同的方法:

程序已运行

放弃:

disown -h是使用已运行程序执行此操作(即如果您忘记了它)的方法nohup。首先必须使用Ctrl+停止它。然后您可以使用(例如)Z将其置于后台。使用 可以获得正在运行的作业及其 jobId 的列表。之后,您可以使用 将其与终端分离。终端会话示例:bg [jobId]bg 1jobsdisown -h %[jobId]

$ gedit 
^Z
[1]+  Stopped                 gedit
$ jobs
[1]+  Stopped                 gedit
$ bg 1
[1]+ gedit &
$ disown -h %1
$ exit

项目尚未开始

禁止

nohup并非在所有机器上都存在。如果你事先知道要解耦,你可以使用:

nohup gedit &

也许您还想重定向 shell 输出,并将程序重定向为伪输入源,因此:nohup ./myprogram > foo.out 2> bar.err < /dev/null &。您可能希望重定向输出,以便不被它打扰或稍后使用它。null-input 可以帮助防止 ssh 等出现故障。

子壳:

您可以通过以下方式实现类似的效果

$ (geany >/dev/null 2>&1 &)

括号打开一个新的子 shell 来运行 gedit。>/dev/null 2>&1将 shell 输出重定向到任何地方(抑制输出)。&最后的将进程置于后台。

终端复用

终端复用也使用屏幕或者屏风。您基本上可以在自己的终端中运行该程序。出于其他原因,我非常推荐 byobu。以下是 boybu 快捷方式列表,可能对您最初的步骤有用:

有用:

  • F2 创建新窗口
  • F3 移至下一个窗口
  • F4 移至上一个窗口
  • F6 断开会话并注销
  • Shift-F6 脱离会话,但不注销
  • F7 进入回滚/搜索模式
  • Ctrl-F5 重新连接任何 SSH/GPG 套接字或代理

不太有用:

  • Shift-F2 水平分割屏幕
  • Ctrl-F2 垂直分割屏幕
  • Shift-F3 将焦点移至下一个拆分
  • Shift-F4 将焦点移至上一个拆分
  • Shift-F5 折叠所有拆分
  • F5 刷新所有状态通知
  • F8 重命名当前窗口
  • F9 启动Byobu配置菜单
  • F12 GNU Screen 的 Esc 键
  • Alt-Pageup 向后滚动查看此窗口的历史记录
  • Alt-Pagedown 向前滚动查看此窗口的历史记录
  • Ctrl-a-! 打开或关闭 Byobu 的所有按键绑定

‘at’ 守护进程及其他

at是一款非常有用的小工具,可以在预定时间运行命令。它可能被“滥用”来将命令从 shell 中分离出来:

echo './myprogram myoption1 myoption2' | at now

您还可以研究setsidstart-stop-daemon,但其他方法就足够了。

答案2

要启动应用程序并将其与启动的终端分离,请使用 zsh 的 &!。

firefox &!

答案3

神秘的“&”符号后缀似乎会导致终端将进程置于后台……(但我不确定那里发生了什么)。

确实如此,而且通常也是您想要的。如果您忘记使用 &,可以使用 ctrl-z 暂停程序,然后使用 bg 命令将其置于后台 — 并继续使用该 shell。

该进程的 stdin、stdout 和 stderr 仍然连接到终端;您可以根据需要将它们从/重定向到 /dev/null 或任何其他文件(例如,将输出日志保存在某处):

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

您可以在作业中查看该进程,将其带回前台(fg 命令),并向其发送信号(kill 命令)。

一些图形程序会脱离终端;如果是这种情况,当你“正常”运行命令时,你会注意到它启动了图形程序“退出”。


以下是一个简短的脚本,你可以把它放在〜/箱,我将其命名为 runbg:

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "$@" &  # $@ is all args

我在重定向之前查找了程序 ($prog),以便可以报告定位错误。以“runbg your-command args...”的形式运行它;如果您需要将输出保存在某处,您仍然可以将 stdout/err 重定向到文件。

除了重定向和错误处理之外,这相当于htorque 的回答

答案4

对于 gedit,我只是一直保持一个副本处于打开状态。只要您有一个现有副本正在运行,gedit从终端启动调用然后关闭终端就不会杀死 gedit。

对于其他事情,其他人说的也行得通。我是nohup...的粉丝,但如果您需要一个可以拆卸然后重新连接的终端,您需要查看screen

  1. 在终端中运行它,然后运行一些不断推送输出的东西。我使用 Django 开发服务器,但irssi甚至watch uptime可以作为很好的例子。
  2. 关闭该终端并启动一个新终端。
  3. 跑起来screen -r然后“轰”的一声,你就回来了。

screen比这大得多,你可以将它与 结合起来byobu以获得更好的终端体验。阅读全文。

相关内容