Как передать текстовые данные из консоли ruby ​​в буфер обмена без сохранения в файл?

Я пытаюсь передать массив, содержащийся в глобальной переменной, которую я создал, в мой буфер обмена на моем Mac.

Это очень долго, поэтому я не хочу выделять, копировать и вставлять на моей консоли.

Я хочу использовать встроенный код Unix, в частности, pbcopy функция для консоли Mac ноутбука, которая позволяет мне передавать текст в буфер обмена моего компьютера, готовый к вставке.

Если бы я сделал это с сохранением файла, я бы сделал что-то вроде этого (в 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`

Но могу ли я сделать это без создания временного файла?

Я уверен, что это возможно. Все вещи в тексте возможны. Заранее спасибо за решение

3 ответа

Решение

Вместо этого вы можете просто повторить его, если в строке нет символов новой строки; в противном случае используйте IO учебный класс.

С помощью echo :

system "echo #{stringdata} | pbcopy"

ИЛИ ЖЕ

`echo #{stringdata} | pbcopy`

Затем Ruby просто скопирует текст из памяти и вставит его в команду оболочки, которая открывает канал между echo а также pbcopy процессы.

С использованием IO учебный класс:

Если вы хотите сделать это Ruby, мы просто создадим канал с pbcopy используя класс IO. Это создает общие файлы между процессами, в которые мы пишем, и 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

Вы можете использовать мой гем буфера обмена для Ruby-API для системного буфера обмена (который также не зависит от платформы, в macOS он будет использовать тот же pbcopy Утилита под капотом), так что вы можете использовать ее из IRB:

require 'clipboard'
Clipboard.copy(stringdata);p

Обычно copy Метод возвращает строку, которая была скопирована. Это причина ;p немного: это трюк, чтобы вернуться nil чтобы консоль не отображала фактические строковые данные.

Другие вопросы по тегам