如何在Ruby控制台中将文本数据传递到剪贴板而不保存到文件中?

31
我正在尝试将我创建的全局变量中包含的数组传递到我的Mac剪贴板上。
由于数组很长,所以我不想在控制台上进行高亮显示、复制和粘贴。
我想使用嵌入的Unix代码,特别是适用于Mac笔记本控制台的pbcopy函数,它允许我将文本传递到计算机的剪贴板中,以便随时粘贴。
如果我要使用文件保存来实现这个目的,我会像这样做(用Ruby语言):
stringdata = “kflxkhdoudopudpdpudpudpyddoyod”
File.open("temp.txt"){|f| f.write(stringdata)}
`cat temp.txt | pbcopy`

但是我能否在不创建临时文件的情况下完成这个任务呢?
我相信这是可能的。在文本中,一切皆有可能。提前感谢您的解决方案。

1
请查看此链接:https://coderwall.com/p/qp2aha/ruby-pbcopy-and-pbpaste - emaxi
3个回答

44

如果字符串中没有换行符,你可以直接使用echo输出;否则,使用IO类。

使用echo

system "echo #{stringdata} | pbcopy"

或者

`echo #{stringdata} | pbcopy`

然后,Ruby会从内存中提取文本,将其注入到打开echopbcopy进程之间的shell命令中。

使用IO类:

如果您想按照Ruby的方式执行此操作,只需使用IO类创建一个管道与pbcopy进行通信。这将在进程之间创建共享文件,我们可以向其中写入内容,而pbcopy将从该文件读取。

IO.popen("pbcopy", "w") { |pipe| pipe.puts "Hello world!" }


我不需要在某种引号中放置文本吗? - boulder_ruby
不,echo 不需要那个。在 IRB 中尝试这段代码:echo #{"helllo this is my test"} | pbcopy ... 然后你就可以从剪贴板中粘贴 hello this is my test 了。 - ianks
3
这个是否应该能在 irb 中运行?我收到了这个回复:Errno::ENOENT: No such file or directory - pbcopy - Pak
3
这段代码似乎无法在 irb 中运行。下面是我在尝试时遇到的情况。$ irb 2.2.2 :001 > echo #{"helllo this is my test"} | pbcopy NameError: undefined local variable or method 'echo' for main:Object - bwest87
3
尝试使用 IO.popen("pbcopy", "w") { |pipe| pipe.puts "Hello world!" } 替代。 - ianks
1
请注意,pbcopy 仅存在于 OS X 中。在 Linux 上,您可以执行类似以下的操作:https://coderwall.com/p/oaaqwq/pbcopy-on-ubuntu-linux - wbharding

17

以下是一个简单的一行方法,您可以将其粘贴到IRB控制台中:

def pbcopy(arg); IO.popen('pbcopy', 'w') { |io| io.puts arg }; end

一旦定义好,你就可以简单地这样做

pbcopy stringdata

或者复制上一条命令的结果:

pbcopy _

当然,您也可以将该方法定义放在初始化程序或其他地方,例如 .irbrc.pryrc(如果您使用 pry)。以下是一个更加美观且略微更智能的版本:

def pbcopy(arg)
  out = arg.is_a?(String) ? arg : arg.inspect
  IO.popen('pbcopy', 'w') { |io| io.puts out }
  puts out
  true
end

1
这对我有用。被采纳的答案没有用。出现了“文件名太长”的错误。谢谢! - iamse7en

9
你可以使用我的剪贴板宝石为Ruby-API提供系统剪贴板支持(同时也是跨平台的,在macOS下,它会在幕后使用相同的pbcopy实用程序),因此你可以在IRB中使用它:
require 'clipboard'
Clipboard.copy(stringdata);p

通常情况下,copy方法会返回被复制的字符串。这就是为什么要使用;p的原因:这是一个技巧,可以返回nil,以便控制台不会显示实际的字符串数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接