我正在尝试将我创建的全局变量中包含的数组传递到Mac上的剪贴板中。
它很长,所以我不想在我的控制台上突出显示、复制和粘贴。
我想使用嵌入式 unix 代码,特别是 mac 笔记本电脑控制台的pbcopy
功能,它允许我将文本传递到我的计算机剪贴板,准备粘贴。
如果我使用文件保存来执行此操作,我会做这样的事情(在 ruby 中):
stringdata = <<blah blah blah process, lets say it failed and the progress data is stored in this variable so we can skip forward to where the script screwed up in a process when we start up and handle the error instance(s)>>
File.open("temp.txt"){|f| f.write(stringdata)}
`cat temp.txt | pbcopy`
但是我可以在不创建临时文件的情况下做到这一点吗?
我相信这是可能的。文本中的所有内容都是可能的。提前感谢您的解决方案
如果字符串中没有换行符,您可以改为回显它;否则,请使用 IO
类。
使用echo
:
system "echo #{stringdata} | pbcopy"
或
`echo #{stringdata} | pbcopy`
然后,Ruby 将从内存中翻录文本,将其注入 shell 命令,该命令会在echo
和pbcopy
进程之间打开一个管道。
使用 IO
类:
如果你想用 Ruby 的方式做到这一点,我们只需使用 IO 类创建一个带有pbcopy
的管道。这会在我们写入的进程和pbcopy
读取的进程之间创建一个共享文件。
IO.popen("pbcopy", "w") { |pipe| pipe.puts "Hello world!" }
下面是一个简单的单行方法,您可以粘贴到 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
您可以使用我的剪贴板 gem 作为系统剪贴板的 Ruby-API(这也是平台独立,在 macOS 上它将使用相同的pbcopy
实用程序),以便您可以从 IRB 使用它:
require 'clipboard'
Clipboard.copy(stringdata);p
通常,copy
方法返回复制的字符串。这就是;p
位的原因:返回nil
以便控制台不会显示实际的字符串数据是一种技巧。