2013-07-04 5 views
17

Ich versuche mplayer zu starten. Mein Dateiname enthält Leerzeichen und diese sollten maskiert sein. Dies ist der Code ich verwende:Wie Strings für Terminal in Ruby zu entkommen?

@player_pid = fork do 
    exec "/usr/bin/mplayer #{song.file}" 
end 

wo #{song.file} einen Pfad wie "/home/example/music/01 - a song.mp3" enthält. Wie kann ich diese Variable richtig umgehen (und möglicherweise andere seltsame Zeichen, die der Titel enthalten kann), damit das Terminal meinen Befehl akzeptiert?

Antwort

29

Shellwords sollte für Sie arbeiten :)

exec "/usr/bin/mplayer %s" % Shellwords.escape(song.file) 

in Ruby 1.9.x, es ist wie Sie es zuerst

require "shellwords" 

Aber in Ruby 2.0.x müssen require aussieht, Ich musste es nicht explizit verlangen.

+0

Danke das funktioniert! – xorinzor

15

Bitte verwenden Sie niemals das Formular "single command line" von exec, das Sie für alle üblichen Probleme mit Angeboten und Einträgen offen hält und sinnlos eine Shell startet. Vom fine manual:

exec (cmdname, arg1, ...)

Befehlsnamen und ein oder mehrere Argumente (keine Shell)

Anstatt also um mucking mit der Quotierung und Flucht und was nicht, benutzen Sie einfach die schalenlose Version:

exec '/usr/bin/mplayer', song.file 

und umgehen die Schale kompl etely. Ähnlich für system.

+1

Die Schwierigkeit hier wird sein, dass nicht jeder den '/ usr/bin/mplayer' Pfad hat, also müssen Sie möglicherweise auf einen Mechanismus verweisen, um die ausführbare Datei zu finden. Natürlich, wenn dieses Programm nur für Ihren Verbrauch ist, sollte es in Ordnung sein. – vgoff

+0

Diese Lösung funktioniert zwar auch, aber da meine Frage eigentlich darin bestand, wie man einer Zeichenkette entkommen kann, werde ich meine Antwort unverändert lassen, danke aber. – xorinzor

+0

@vgoff: Du weißt, dass 'exec' den' PATH' sucht, richtig? Und wenn Sie versuchen, '/ usr/bin/mplayer' mit beiden Formen von' exec' zu verwenden und Sie nicht 'mplayer' in'/usr/bin' haben, dann wird es natürlich in beiden Fällen fehlschlagen. –

Verwandte Themen