我有以下观察:
$ 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 和守护进程。