2014-12-03 3 views
9

Ich versuche, das Array in einer globalen Variablen, die ich erstellt habe, in meine Zwischenablage auf meinem Mac zu übergeben.Wie kann ich Textdaten aus der Ruby-Konsole in meine Zwischenablage übertragen, ohne sie in einer Datei zu speichern?

Es ist sehr lang, also möchte ich nicht markieren, kopieren Sie & Paste auf meiner Konsole.

Ich möchte eingebetteten Unix-Code verwenden, speziell die pbcopy Funktion für die Mac-Laptop-Konsole, die mir erlaubt, Text in meine Computer-Zwischenablage, bereit zum Einfügen.

Wäre ich dies mit einem tun, Datei speichern, führte ich so etwas tun würde (in 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` 

Aber ich könnte dies möglicherweise tun, ohne eine temporäre Datei zu erstellen?

Ich bin mir sicher, dass das möglich ist. Alle Dinge im Text sind möglich. Vielen Dank im Voraus für die Lösung

+1

sehen: https://coderwall.com/p/qp2aha/ruby-pbcopy-and-pbpaste – emaxi

Antwort

15

Sie können es stattdessen nur echo, wenn keine Zeilenumbruch Zeichen in der Zeichenfolge sind; Andernfalls verwenden Sie die Klasse IO.

Mit echo:

system "echo #{stringdata} | pbcopy" 

OR

`echo #{stringdata} | pbcopy` 

Rubin wird dann einfach den Text aus dem Speicher rippen, injizieren sie in den Shell-Befehl, der zwischen den echo und pbcopy Prozesse ein Rohr öffnet, .

Mit der IO Klasse:

Wenn Sie es den Ruby-Weg machen wollen, schaffen wir einfach ein Rohr mit pbcopy die IO-Klasse. Dies erzeugt eine gemeinsame Dateien zwischen den Prozessen, die wir schreiben, und pbcopy liest aus.

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

+0

würde nicht, dass ich den Text in Zitaten setzen eine Art?? –

+0

Nein, echo erfordert das nicht. Probieren Sie diesen Code im IRB aus: 'echo # {" helllo das ist mein Test "} | pbcopy' ... Sie können dann 'Hallo, das ist mein Test' aus Ihrer Zwischenablage einfügen. – ianks

+0

Ich habe gerade die Antwort mit einem idiomatischen Ruby-Stil aktualisiert. – ianks

4

Sie my clipboard gem für Ruby-API in die Zwischenablage verwenden können (die auch Plattform independet ist, auf macOS wird es das gleiche pbcopy Dienstprogramm unter der Haube verwenden), so dass Sie von verwenden kann IRB:

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

Üblicherweise wird die copy Methode gibt die Zeichenfolge, die kopiert wurde. Dies ist der Grund für das Bit ;p: Es ist ein Trick, nil zurückzugeben, so dass die Konsole die tatsächlichen Zeichenfolgedaten nicht anzeigen würde.

1

Hier ist eine einfache einzeilige Methode, die Sie in Ihre IRB-Konsole einfügen können:

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

Sobald es definiert ist man einfach

tun können
pbcopy stringdata 

oder das Ergebnis des letzten Befehls kopieren mit

pbcopy _ 

Natürlich können Sie die Methodendefinition auch in einen Initialisierer oder etwas wie 0 setzenoder .pryrc wenn Sie pry verwenden. Hier ist ein schöner und etwas intelligentere Version:

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

Das funktionierte für mich. Akzeptierte Antwort nicht. "Dateiname zu lang" Fehler. Vielen Dank! – iamse7en

Verwandte Themen