zsh与bash中的'bg'命令之前略有不同

zsh与bash中的'bg'命令之前略有不同,bash,shell,zsh,Bash,Shell,Zsh,今天我观察到一个奇怪的行为,我希望我能得到一些指导 这是我正在做的。。。 至少有一个进程已经在后台运行,我中断(Ctrl+Z)前台进程,然后用bg将其置于后台 以下是zsh中的结果: 下面是它在bash中的样子: 那么,为什么bash将bg放在后台的进程作为“当前”进程(用“+”表示,如果运行fg将恢复该进程),而zsh将“其他”进程设置为当前进程?我找不到任何文件表明行为会有所不同。。。有趣的是,如果您在zsh中执行多个fg+^Z+bg,则“当前”进程选择将“触发器” 还有人看到过吗?我可以在

今天我观察到一个奇怪的行为,我希望我能得到一些指导

这是我正在做的。。。 至少有一个进程已经在后台运行,我中断(Ctrl+Z)前台进程,然后用
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