这两个过程:
cat /dev/tty > /dev/null &
cat /dev/zero > /dev/null &
必须在后台运行,但我无法将第二项工作带到前台。
答案1
如果这是两个普通作业,则 aa plainfg
会将第二个作业带到前台(如果这是最近暂停的后台作业或最近启动的后台作业(没有其他作业被暂停))。
然而,根据第一个作业(从 读取)的性质/dev/tty
,一旦它尝试从 TTY 读取,它就会停止。fg
因此将把它回到前台。
考虑到没有其他作业,这里的解决方案是使用%-
或。%2
当将作业放入后台时(无论是通过使用结尾的 启动作业&
,还是通过使用 暂停前台作业Ctrl+Z然后发出命令 )bg
,该作业都会被赋予“作业 ID”或“作业规范”。此作业 ID 通常用 表示,%N
其中N
是某个十进制数。
您可以将作业 ID 与多个命令一起使用,例如wait
、kill
和。例如,该命令可用于使用其作业 ID 向后台作业发送信号。fg
bg
kill
默认情况下,该fg
命令适用于“当前作业”。当前作业的作业 ID 可通过%+
或获得%%
。当前作业是最近启动的后台作业,或者,如果有暂停的作业,则为最近暂停的作业。
要将任意后台作业移动到前台,请使用其作业 ID:
$ sleep 1000 &
[1] 37327
$ sleep 500 &
[2] 83532
$ jobs
[1]- Running sleep 1000 &
[2]+ Running sleep 500 &
$ fg %1
sleep 1000
输出+
中的jobs
表示“当前作业”(这是通过简单调用 切换到的作业fg
)。
POSIX 标准特殊作业 ID:
%%
,目前的工作。%+
,同上。%-
,上一份工作。%N
, 工作编号N
。%string
,命令以 开头的作业string
。%?string
,其命令包含 的作业string
。
答案2
你尝试过fg
命令吗?
fg %2
答案3
while$!
包含进程 ID最上面的最近在后台启动的作业的进程,很难得到它工作以万无一失的方式进行 ID。
它不一定是最大的作业 ID,因为作业 ID 会被重复使用。它不一定是您可能引用的作业%%
或%+
(或fg
没有参数的情况下会采取行动),因为挂起的作业优先(就像在您的情况下,第一个作业可能会被挂起,因为它会尝试从 tty 读取而不是在前台)或者最近开始的作业可能已经死亡(在这种情况下%+
将引用列表中的下一个作业)。
因此,您需要jobs
首先运行以了解您想要的作业的作业编号fg
(使用 use ),或者如果名称中fg %thatnumber
没有其他作业,请运行:zero
fg %\?zero
有了zsh
,您可以使用:
fg_most_recent() {
local job=${(k)jobstates[(R)*:$!=*]}
((job)) && fg %$job
}
也就是说,获取其值与模式匹配的关联数组k
的ey (看起来像是给出了直接启动的作业中所有进程的状态)。$jobstates
*:$!=*
$jobstates
running:+:20162=running:20163=running
zsh