zsh与bash中的'bg'命令之前略有不同
今天我观察到一个奇怪的行为,我希望我能得到一些指导 这是我正在做的。。。 至少有一个进程已经在后台运行,我中断(Ctrl+Z)前台进程,然后用zsh与bash中的'bg'命令之前略有不同,bash,shell,zsh,Bash,Shell,Zsh,今天我观察到一个奇怪的行为,我希望我能得到一些指导 这是我正在做的。。。 至少有一个进程已经在后台运行,我中断(Ctrl+Z)前台进程,然后用bg将其置于后台 以下是zsh中的结果: 下面是它在bash中的样子: 那么,为什么bash将bg放在后台的进程作为“当前”进程(用“+”表示,如果运行fg将恢复该进程),而zsh将“其他”进程设置为当前进程?我找不到任何文件表明行为会有所不同。。。有趣的是,如果您在zsh中执行多个fg+^Z+bg,则“当前”进程选择将“触发器” 还有人看到过吗?我可以在
bg
将其置于后台
以下是zsh
中的结果:
下面是它在bash
中的样子:
那么,为什么bash
将bg
放在后台的进程作为“当前”进程(用“+”表示,如果运行fg
将恢复该进程),而zsh
将“其他”进程设置为当前进程?我找不到任何文件表明行为会有所不同。。。有趣的是,如果您在zsh
中执行多个fg
+^Z
+bg
,则“当前”进程选择将“触发器”
还有人看到过吗?我可以在
bash
和zsh
中重现这种行为
我的TL;DR answer:您在bash
中看到的行为已记录在案。你在zsh
中看到的行为不是(我发现的),我有一个理论,可能是错误的
Bash: 第7节“作业控制基础”描述了内置
bg
的行为:
符号“%”和“%”表示shell对当前作业的概念,当前作业是在前台停止或在后台启动的最后一个作业
因此,从bash的角度来看,当前作业是在前台停止或在后台启动的最后一个作业。这解释了问题中注意到的行为:
那么,为什么bash将进程放在后台,而bg是“当前”进程呢
ZSH: 我无法为
zsh
解释这一点。在作业
一节下,解释了作业
中+
和-
的zsh
含义:
%%当前工作。%+相当于“%”。
%-以前的工作 但是,它没有解释
bg
、fg
和^Z
在将它们降级到之前的或当前的方面对流程有什么影响
我的理论是,zsh
使用一个“当前进程堆栈”,我还没有通过在irc.freenode.net#zsh
中纠缠好人来验证这个理论bg
将current
进程推到队列的末尾。这可以在玩三个过程时看到,因此:
simont@charmander ~/repositories/SOTesting/bg
$ one.sh& [1:52:41]
[1] 98369
simont@charmander ~/repositories/SOTesting/bg
$ two.sh& [1:52:49]
[2] 99293
simont@charmander ~/repositories/SOTesting/bg
$ three.sh [1:52:51]
^Z
[3] + 973 suspended three.sh
simont@charmander ~/repositories/SOTesting/bg
$ jobs [1:52:55]
[1] running one.sh
[2] - running two.sh
[3] + suspended three.sh
simont@charmander ~/repositories/SOTesting/bg
$ bg [1:52:57]
[3] - 973 continued three.sh
simont@charmander ~/repositories/SOTesting/bg
$ jobs [1:52:59]
[1] running one.sh
[2] + running two.sh
[3] - running three.sh
正如我们在这里看到的,one
和two
被推到理论堆栈上<代码>三个
,最后执行(?)是当前进程
,由作业
输出的+
表示。
three
被挂起后,它仍然是当前进程,但是bg
之后,它被推到上一个进程和two
,作为“堆栈”中的“顶部”进程成为新的当前进程
然而,这只是猜测;正如我所说,我还没有这方面的文档证明,老实说,manzsh*
页面有点复杂;我可能错过了什么。什么版本的zsh和什么平台?我无法在Linux上用zsh 4.3.2重现这种行为。
$ other-command-previously-run &
[1] 12345
$ some-long-running-command
^Z
[2]+ Stopped some-long-running-command
$ bg
[2]+ some-long-running-command &
$ jobs
[1]- Running other-command-previously-run &
[2]+ Running some-long-running-command &
$
simont@charmander ~/repositories/SOTesting/bg
$ one.sh& [1:52:41]
[1] 98369
simont@charmander ~/repositories/SOTesting/bg
$ two.sh& [1:52:49]
[2] 99293
simont@charmander ~/repositories/SOTesting/bg
$ three.sh [1:52:51]
^Z
[3] + 973 suspended three.sh
simont@charmander ~/repositories/SOTesting/bg
$ jobs [1:52:55]
[1] running one.sh
[2] - running two.sh
[3] + suspended three.sh
simont@charmander ~/repositories/SOTesting/bg
$ bg [1:52:57]
[3] - 973 continued three.sh
simont@charmander ~/repositories/SOTesting/bg
$ jobs [1:52:59]
[1] running one.sh
[2] + running two.sh
[3] - running three.sh