我有以下观察:

$ xclip text.txt

执行立即终止,它将text.txt的内容复制到默认选择的XA_PRIMARY中,这意味着您可以通过鼠标中键或xclip -o粘贴它。

当我想看看xclip在做什么时,它不再终止了:
$ xclip -verbose text.txt
Connected to X server.
Using UTF8_STRING.
Reading text.txt...
Waiting for selection requests, Control-C to quit
  Waiting for selection request number 1

直到我在X11系统中选择了某些内容,它才会终止,例如,我粘贴到此处的输出内容。如果行为仅限于verbose,我将理解这一点。毕竟,您想坐在那里看看会发生什么。

我可以使用strace重现相同的行为,但前提是必须提供fork选项
$ strace -f xclip text.txt

或者使用系统执行命令从Ruby进行脱 shell 时,该命令应该返回输出,实际上什么也没有。
$ ruby -e "`xclip text.txt`"
strace给出的提示是,它正在轮询文件描述符以等待事件。如果我选择某项,此事件将得到满足。这种行为可以解释吗?我已经得到证据,这在任何系统上都无法重现。可能与票证#9 Not closing stdout when setting clipboard from stdin有关吗?

我在Ubuntu 13.04上运行xclip版本0.12。

最佳答案

XClip在没有-verbose的情况下启动时会派生一个 child 。 -verbose的唯一区别是没有 fork 的子项,并且相同的原始进程处理ConvertSelection事件。

通常在X Window工具箱中,复制/粘贴是通过X Selections实现的:



选择的内容存储在应用程序本身中,并通过
ConvertSelection事件(此处为“转换”,因为有一种方法可以让客户端
询问所选数据的特定模仿类型(或“ View ”或格式)。
转换再次发生在拥有选定缓冲区的应用程序中。

由于采用了这种架构,因此无法“将文本复制到系统
缓冲区和退出”-因为您是系统缓冲区。XClip模拟“复制并退出”
通过 fork 和守护进程。

10-08 19:44