直到最近,我对zsh 中的fg
and命令的工作方式还非常满意,即:jobs
- 只是
fg
-> 再次将最近的后台作业置于前台 jobs
-> 显示命令名称(包括参数),甚至可能是 PID(不记得了)
在最新的 Fedora 33 更新之后,这些 zsh 行为以一种(对我来说)非常烦人的方式发生了变化:
fg
现在将作业 ID 最低的作业置于前台(即不是最近后台作业)- “jobs”输出更加简洁,例如:
[3] + suspended (signal) mutt
[4] - suspended
其中工作4
是 vim 会话...
所以我推测一些 zsh 默认值发生了变化。因此我的问题是:如何配置更有用的行为fg
并jobs
返回?
(这意味着我如何才能jobs
始终显示带有参数和 pid 的命令名称,并将fg
最近的后台作业置于前台?)
(我目前在 zsh-5.8-3.fc33.x86_64。)
编辑1:示例会话:
$ zsh
~ $ man man
zsh: suspended man man
~ $ vim blah
zsh: suspended
~ $ jobs
[1] - suspended man man
[2] + suspended
~ $ fg
[2] - continued
zsh: suspended
zsh: suspended
~ $ jobs
[1] + suspended man man
[2] - suspended
CtrlZ请注意,我每次都通过暂停前台作业。+
在输出中查找标记jobs
。同样让我惊讶的是,zsh: suspended
第二次暂停 vim 后我得到了 2 行。看起来挂起信号再次传递给已经挂起的 man 进程?
编辑2:仅当一项作业为 时,才会出现作业控制问题vim
。因此,关于如何调用 vim 的一些细节:
$ which vim
vim=__vi_internal_vim_alias
$ alias vim
vim=__vi_internal_vim_alias
$ typeset -f __vi_internal_vim_alias
__vi_internal_vim_alias () {
(
test -f /usr/bin/vim && exec /usr/bin/vim "$@"
test -f /usr/bin/vi && exec /usr/bin/vi "$@"
)
}
好吧,这些定义不是来自我的个人资料。看来它们来自系统更改。如果我调用vim
作业\vim
控制问题就不会再出现。看起来子 shell 弄乱了 zsh 的命令行字符串创建和其他东西。也可以看看其他有关的报告。
那么这是从哪里来的:
$ cd /etc
$ grep -r __vi_internal_vim_alias . -r 2>/dev/null
./profile.d/vim.sh:__vi_internal_vim_alias()
./profile.d/vim.sh: alias vi=__vi_internal_vim_alias
./profile.d/vim.sh: alias vim=__vi_internal_vim_alias
./profile.d/vi.sh:__vi_internal_vim_alias()
./profile.d/vi.sh: alias vi=__vi_internal_vim_alias
./profile.d/vi.sh: alias vim=__vi_internal_vim_alias
$ rpm -qf ./profile.d/vim.sh
vim-enhanced-8.2.2146-2.fc33.x86_64
$ rpm -qf ./profile.d/vi.sh
vim-minimal-8.2.2146-2.fc33.x86_64
答案1
这是由 Fedora 开始定义vim
在子 shell 中启动 vim 的系统范围别名引起的。
由于这似乎破坏了左右的东西,这些别名现在正在回滚:https://bugzilla.redhat.com/show_bug.cgi?id=1918575