为什么当我退出 Vim 时 xclip 进程会被杀死?

为什么当我退出 Vim 时 xclip 进程会被杀死?

如果我在没有配置的情况下启动 tmux:

$ tmux -Ltest -f/dev/null new

然后在没有配置的情况下启动 Vim:

$ vim -Nu NONE

hello然后从 Vim 运行 xclip 以在剪贴板中写入:

:call system('xclip -selection clipboard', 'hello')

然后退出 Vim:

:q

hello仍在剪贴板中;$ xclip -selection clipboard -o输出hello


如果我重复相同的实验,但在 tmux 分割窗口中启动 Vim(实验 2):

$ tmux splitw vim -Nu NONE

一旦我退出 Vim,xclip 进程就会被终止,剪贴板为空。


如果我重复相同的实验,但使用 Nvim(实验 3),xclip 进程不会被终止,并且剪贴板仍然存在。我查看了:h vim-differencesNvim 的文档并发现了这一点:

|system()|, |systemlist()| can run {cmd} directly (without 'shell')

这让我认为这个问题是由于 Vim 用 shell 启动 xclip,而 Nvim 在没有 shell 的情况下启动它。为了验证我的假设,我重复了相同的实验,但这一次,我在一个文件中写入,并使用而不是hello启动 xclip ,因为前者可以在没有 shell 的情况下启动进程(实验 4):job_start()system()

$ echo hello >/tmp/file
$ tmux -Ltest -f/dev/null new
$ tmux splitw vim -Nu NONE
:call job_start('xclip -selection clipboard /tmp/file')
:q

事实上,退出 Vim 后,xclip 进程仍然存在,并且剪贴板仍然包含hello.


我想了解为什么中间 shell 的创建是一个问题。所以,在实验2,在退出Vim之前,我检查了xclip进程的祖先:

$ pstree -s -p $(pidof xclip)
systemd(1)---lightdm(951)---lightdm(1126)---upstart(1156)---xclip(15389)

同样的事情在实验4:

$ pstree -s -p $(pidof xclip)
systemd(1)---lightdm(951)---lightdm(1126)---upstart(1156)---xclip(18541)

进程树是相同的,我看不到 Vim 创建的中间 shell(可能是因为它被杀死并且 xclip 被重新设置为新贵进程的父级)。

那么为什么当我在实验 2 中退出 Vim 时 xclip 会被杀死,而当我在实验 4 中退出 Vim 时 xclip 不会被杀死呢?


编辑:

输出$ uname -a

Linux ubuntu 4.15.0-51-generic #55~16.04.1-Ubuntu SMP Thu May 16 09:24:37 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

输出$ vim --version | head -n2

VIM - Vi IMproved 8.1 (2018 May 18, compiled May 30 2019 04:42:18)
Included patches: 1-1421

输出$ tmux -V

tmux next-3.1

输出$ zsh --version

zsh 5.7.1 (x86_64-pc-linux-gnu)

相关内容