irb(main):001:0> require 'benchmark'
=> true
irb(main):002:0> puts Benchmark.measure { system "xclip .bashrc" }
0.000000 0.000000 0.000000 ( 0.008030)
=> nil
irb(main):003:0> puts Benchmark.measure { `xclip .bashrc` }
0.000000 0.000000 0.000000 ( 33.215158)
=> nil
irb(main):004:0> RUBY_VERSION
=> "2.0.0"
我已经在互联网上阅读了几乎所有有关从ruby脚本调用shell命令的方法的所有内容,但是我不知道为什么
Kernel#`
比Kernel#system
花费更长的时间。更新:
Kernel#`
仅使用xclip
慢得多。所有其他命令几乎都花费相同的时间。 最佳答案
我怀疑当您使用反引号进行炮击时,xclip
会花费很长时间终止。这与选择有关。如果没有通过-sel
提供任何选择,它将默认为XA_PRIMARY
,通常用于通过鼠标中键实现复制和粘贴。
当你运行
$ xclip text.txt
可以通过
XA_PRIMARY
获得内容,这意味着您可以通过鼠标中键或$ xclip -o
粘贴它。当您在Ruby中通过shell执行它时,它开始变得很奇怪:ruby -e '`xclip text.txt`
如果您什么也不做,它永远不会真正终止。当您在X11系统中选择控制台(例如在控制台或其他任何地方)时,它终止。只需选择,用鼠标标记即可。如果您不这样做,它将在某些时候挂起和/或超时。
当您使用详细模式时,可以观察到相同的行为:
$ 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
当您选择某项内容时,再次满足选择请求。
一个很好的分析工具是
strace
(-f
选项也用于跟踪fork)$ strace -f ruby -e '`xclip text.txt`'
...
poll([{fd=3, events=POLLIN|POLLOUT}], 1, 4294967295) = 1 ([{fd=3, revents=POLLOUT}])
writev(3, [{"\20\0\3\0\4\0\200\2INCR", 12}, {NULL, 0}, {"", 0}], 3) = 12
poll([{fd=3, events=POLLIN}], 1, 4294967295) = 1 ([{fd=3, revents=POLLIN}])
recvfrom(3, "\1\0\f\0\0\0\0\0\235\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 4096, 0, NULL, NULL) = 32
recvfrom(3, 0x165e964, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(3, 0x165e964, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=3, events=POLLIN}], 1, 4294967295
在最后一行中,它挂起直到做出选择。
poll()
用于等待文件描述符中的文件事件。它将在某个点终止,但是4,294,967,295毫秒相当长。仅需使用strace -f xclip text.txt
即可对其进行跟踪。您可以通过
ls -l /proc/PID/fd
查看文件描述符。数字3是文件描述符,其中xclip
等待选择。很难调试的是,如果if立即以
strace xclip text.txt
终止,而不是以strace -f text.txt
终止。您想要跟踪 fork 的那一刻不再起作用。这与Ruby一样。它尝试跟踪输出,因为Kernel#`
想要返回输出。这可能与票证#9 Not closing stdout when setting clipboard from stdin有关。这是我的理论。当您退出并希望跟踪
xclip
的输出时(无论是使用Ruby从标准输出中读取还是通过strace
跟踪叉),在您进行选择之前,标准输出不会关闭。这并不能很好地解释它,但是它表明使用Ruby不需要做任何事情。我将创建一个仅关注
xclip
而不是Ruby上下文的问题。关于ruby - 为什么Ruby中 `xclip .bashrc`比系统(“xclip .bashrc”花费更长的时间?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19237559/