2017-05-20 3 views
0

Ich versuche, ein einfaches Ruby-Skript zu erstellen, um einen ffmpeg-Befehl über Bash auszuführen, um eine Audiodatei von einem Format in ein anderes zu konvertieren.Scripting Bash mit Ruby und Variablen FFMPEG-Befehl ausführen

der Befehl ffmpeg -i (in file) -acodec libmp3lame -ab 64k -ar 48000 -ac 1 AAA_S00E00_Podcast.mp3

ich einen Ruby-Skript mit den richtigen Berechtigungen verfügen, und dass ich anrufen kann (es mit einem system ls Anruf getestet, bevor sie auf den ffmpeg Versuch zu bewegen)

#!/bin/ruby 

def mkmp3(one = "", two = "") 
    system "ffmpeg -i #{one} -acodec libmp3lame -ab 64k -ar 48000 -ac 1 #{two}.mp3" 
end 

mkmp3 

aber wenn ich nennen es aus bash versucht, eine Datei session.flac zu smoochie.mp3 genannt zu konvertieren komme ich zurück:

mkmp3.rb ('session.flac', 'smoochie') 
bash: syntax error near unexpected token `'session.flac',' 

Antwort

1

Der Fehler tritt auf, weil Sie die Klammern ( und ) verwenden, um Ihrem Ruby-Skript Argumente hinzuzufügen. Entferne sie und der Fehler wird weg sein; in der Tat, müssen Sie nur durch ein Leerzeichen getrennt die Saiten spezifizieren (sonst werden Sie das Komma erhalten , als String):

$ mkmp3.rb session.flac smoochie 

Nun, diese Parameter verwenden Sie ARGV in Ihrem Skript hinzufügen müssen, wie dies:

#!/bin/ruby 

def mkmp3(one = ARGV[0], two = ARGV[1]) 
    system "ffmpeg -i #{one} -acodec libmp3lame -ab 64k -ar 48000 -ac 1 #{two}.mp3" 
end 

mkmp3 

ARGV wird ein Array von Strings mit den Argumenten, die Sie hinzugefügt, sollten Sie dieses Skript (test.rb) enthalten:

#!/bin/ruby 

puts ARGV.inspect 

Führen Sie das Skript:

$ ruby so.rb one two 

Und so wird der Ausgang sein:

["one", "two"] 

den Array-Index So greifen Sie auf den jeweiligen Wert mit (d ARGV[0] und ARGV[1]).

1

Sie können keine Argumente an eine Funktion in Ihrem Skript übergeben, indem Sie das Skript mit Werten in Klammern aufrufen. Sie müssen ARGV verwenden, um Argumente für das Skript zu verarbeiten.

Ich habe nicht ffmpeg auf meinem System, also werde ich zeigen, wie mit einer einfachen Funktion Befehlszeile Argumente verwenden, die ihre Argumente berichtet:

def my_function(first = "default1", second = "default2") 
    puts "Args were #{first} and #{second}" 
end 

if __FILE__ == $PROGRAM_NAME # only invoke with ARGV if script is invoked directly 
    my_function(*ARGV) # flatten the ARGV array and pass all values 
end 

erzeugt die folgende, wenn sie mit verschiedenen Nummern aufgerufen von Argumenten:

Desktop$ ruby argv_demo.rb 
Args were default1 and default2 
Desktop$ ruby argv_demo.rb one 
Args were one and default2 
Desktop$ ruby argv_demo.rb one two 
Args were one and two 
Desktop$ ruby argv_demo.rb one two three 
argv_demo.rb:1:in `my_function': wrong number of arguments (given 3, expected 0..2) (ArgumentError) 
    from argv_demo.rb:6:in `<main>'