作业控制是 shell 和 tty 驱动程序中的一组功能,允许用户从单个交互式 shell 管理多个作业。
作业是单个命令或管道。如果你跑步ls
,那是一份工作。如果你跑步ls|more
,那仍然只是一份工作。如果您运行的命令启动了它自己的子进程,那么它们也将属于同一个作业,除非它们被有意分离。
&
如果没有作业控制,您可以通过添加到命令行将作业置于后台。这就是您拥有的所有控制权。
通过作业控制,您还可以:
- 暂停正在运行的前台作业CtrlZ
- 在前台恢复暂停的作业
fg
- 在后台恢复暂停作业
bg
- 将正在运行的后台作业带入前台
fg
shell 维护着一个作业列表,您可以通过运行该jobs
命令查看这些作业。每个都分配有一个作业编号(与组成作业的进程的 PID 不同)。您可以使用前缀为 的作业编号%
作为参数,fg
或bg
将作业选择到前台或后台。shell 的内置kill
命令也可以使用 %jobnumber 表示法。这很方便,因为作业编号从 1 开始分配,因此它们比 PID 短。
%+
最近前台作业和先前前台作业也有快捷方式%-
,因此您可以在两个作业之间快速来回切换CtrlZ(fg %-
暂停当前作业,恢复另一作业),而无需记住数字。或者您可以使用命令本身的开头。如果您暂停了一个ffmpeg
命令,恢复它就像fg %ff
(假设没有其他活动作业以“ff”开头)一样简单。作为最后一个快捷方式,您不必键入fg
. 只需%-
作为命令输入即可将前一个作业置于前台。
“但我们为什么需要这个?” 我能听到你在问。“如果我想运行另一个命令,我可以启动另一个 shell。” 诚然,多任务处理方式有很多种。在正常的一天,我在 tty1 到 tty10 上运行登录 shell(是的,超过 6 个,您只需要激活它们),其中一个将运行一个包含 4 个屏幕的屏幕会话,另一个可能有一个 ssh 正在运行在它上面有另一个在远程机器上运行的屏幕会话,加上我的带有 3 或 4 个 xterms 的 X 会话。我仍然使用工作控制。
如果我在vi
or less
or aptitude
or 任何其他交互的事情中,我需要运行几个其他的快速命令来决定如何继续CtrlZ,运行命令,并且fg
是自然而快速的。(在很多情况下,交互式程序都有一个!
键绑定来为您运行外部命令;我认为这不太好,因为您没有从 shell 的历史记录、命令行编辑器和完成系统中受益。)我每当我看到有人启动辅助 xterm/screen/whatever 来运行一个命令时,我都会感到难过,看两秒钟,然后退出。
现在关于你的这个脚本。总的来说,它似乎没有写得很好。有问题的行:
bash -i -c "ssh -D 7070 -N user@my-ssh.example.com > /dev/null"
令人困惑。我不明白为什么 ssh 命令被传递到一个单独的 shell 而不是直接从主脚本执行,更不用说为什么有人添加-i
它了。该-i
选项告诉 shell 以交互方式运行,从而激活作业控制(除其他外)。但它实际上并没有被交互式使用。无论单独的 shell 和 . 背后的目的是什么-i
,关于作业控制的警告都是副作用。我猜想绕过 ssh 的一些不良功能是一种黑客行为。这就是当你这样做时,你应该评论它的那种事情。