如何将文本数据从ruby控制台传递到我的剪贴板而不保存到文件?

bou*_*uby 14 ruby unix clipboard pbcopy

我正在尝试将我创建的全局变量中包含的数组传递到我的mac上的剪贴板中.

它很长,所以我不想在我的控制台上突出显示,复制和粘贴.

我想使用嵌入式unix代码,特别是pbcopymac笔记本电脑控制台的功能,它允许我将文本传递到我的计算机剪贴板,准备粘贴.

如果我用文件保存这样做,我会做这样的事情(在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`
Run Code Online (Sandbox Code Playgroud)

但是我可以在不创建临时文件的情况下这样做吗?

我确信这是可能的.文本中的所有内容都是可能的.提前感谢您的解决方案

ian*_*nks 23

如果字符串中没有换行符,您可以回复它; 否则,请使用该IO课程.

使用echo:

system "echo #{stringdata} | pbcopy"
Run Code Online (Sandbox Code Playgroud)

要么

`echo #{stringdata} | pbcopy`
Run Code Online (Sandbox Code Playgroud)

然后,Ruby将从内存中删除文本,将其注入shell命令,该命令在echopbcopy进程之间打开管道.

使用IO课程:

如果你想用Ruby方式做,我们只需pbcopy使用IO类创建一个管道.这将在我们写入的进程之间创建一个共享文件,并将pbcopy从中读取.

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

  • 这应该能够在`irb`中运行吗?我得到了这个回复:`Errno :: ENOENT:没有这样的文件或目录--pbcopy`` (3认同)
  • 这似乎不在`irb`中运行.这是我做的时候发生的事情.`$ irb 2.2.2:001> echo#{"helllo这是我的测试"} | pbcopy NameError:未定义的局部变量或方法'echo'表示main:Object` (3认同)
  • 尝试使用`IO.popen(“ pbcopy”,“ w”){|管道| pipe.puts“世界你好!” }`。 (2认同)

J-_*_*_-L 7

您可以将我的剪贴板gem用于Ruby-API到系统剪贴板(也是平台独立的,在macOS上它将使用相同的pbcopy实用程序),以便您可以在IRB中使用它:

require 'clipboard'
Clipboard.copy(stringdata);p
Run Code Online (Sandbox Code Playgroud)

通常,该copy方法返回已复制的字符串.这就是;p比特的原因:这是一个技巧,nil以便控制台不会显示实际的字符串数据.


lin*_*zzy 6

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

def pbcopy(arg); IO.popen('pbcopy', 'w') { |io| io.puts arg }; end
Run Code Online (Sandbox Code Playgroud)

定义好之后,您只需

pbcopy stringdata
Run Code Online (Sandbox Code Playgroud)

或复制上一条命令的结果

pbcopy _
Run Code Online (Sandbox Code Playgroud)

当然,您也可以将方法定义放在初始化程序之类的东西中,例如.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
Run Code Online (Sandbox Code Playgroud)