gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:05:57 25 4
gpt4 key购买 nike

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

这是我正在做的...

至少有一个进程已经在后台运行,我中断 (Ctrl + Z) 前台进程,然后用 bg 将其置于后台。 .

这是 zsh 中的结果:

$ some-long-running-command
^Z
zsh: suspended some-long-running-command
$ bg
[2] - continued some-long-running-command
$ jobs
[1] + running other-command-previously-run
[2] - running some-long-running-command
$

这是它在 bash 中的样子:

$ 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 &
$

那么为什么 bash使用 bg 将进程置于后台作为“当前”进程(由“+”表示,如果运行 fg 将恢复),而 zsh将“其他”进程设置为当前进程?我找不到任何表明行为会有所不同的文档......有趣的是,如果你做几个 fg + ^Z + bgzsh ,“当前”进程选择将“翻转”。

有没有人看到这个?

最佳答案

我可以在 bashzsh 中重现此行为。

我的 TL;DR 答案:您在 bash 中看到的行为已记录在案。您在 zsh 中看到的行为不是(我发现的),我有一个理论,这可能是错误的。


bash :

Bash Manual ,第 7 节,“作业控制基础”描述了内置 bg 的行为:

The symbols ‘%%’ and ‘%+’ refer to the shell's notion of the current job, which is the last job stopped while it was in the foreground or started in the background.

因此,从 bash 的角度来看,当前作业最后一个作业,要么在前台停止,要么在后台启动.这解释了问题中注意到的行为:

So why does bash keep the process placed in background with bg as the "current" process


ZSH:我无法为 zsh 解释这一点。 man zshmisc page ,在 JOBS 部分下,通过 jobs 中的 +- 解释了 zsh 的含义>:

%% Current job.
%+ Equivalent to ‘%%’.
%- Previous job.

但是,它解释了bgfg^Z 对进程的影响在将它们降级到 previouscurrent 方面。

我的理论zsh 使用“当前进程堆栈”; bg当前 进程推到队列的末尾。这可以在玩三个进程时看到:


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

正如我们在这里看到的,onetwo 在理论堆栈上被下推了。 three,最后执行的(?)是当前进程,由jobs输出的+表示。
three挂起之后还是当前进程,但是bg之后,被推到previous进程和two,作为“堆栈”中的“顶部”进程成为新的当前进程。

然而,这只是推测;就像我说的,我还没有这方面的证明文件,老实说,man zsh* 页面有点复杂;我可能错过了什么。

关于bash - zsh 与 bash 中的 `bg` 命令之前略有不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9949510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com