Ruby, eine großartige Sprache für Shell-Skripte
(lucasoshiro.github.io)- Ruby wird meist mit dem Rails-Framework in Verbindung gebracht, sodass man leicht vergisst, was diese Sprache sonst noch so gut macht
- Ruby ist eine sehr umfangreiche und ausgereifte Sprache, die besonders beim Schreiben komplexer Shell-Skripte nützlich ist
- Ziel dieses Artikels
- die nützlichen Ruby-Funktionen beim Schreiben von Shell-Skripten zu zeigen und sie mit Bash und Python zu vergleichen
- nicht, Bash-Skripte vollständig durch Ruby-Skripte zu ersetzen
Funktion 1: Externe Befehle aufrufen
- In Ruby werden zum Aufrufen externer Befehle Backticks(```) verwendet.
- Zum Beispiel kann man mit Backticks die Ausgabe eines externen Befehls in einer Variablen speichern.
- Man kann auch
systemoderpopenverwenden.`ls` - Die Ausgabe des Befehls kann in einer Variablen gespeichert werden.
my_date=`date`
Funktion 2: Statuscode
- Mit der Variablen
$?kann man den Statuscode des letzten Befehls prüfen - Sehr ähnlich zu Bash
`true` puts $? # 0 `false` puts $? # 1
Funktion 3: Typisiertes Sprachmodell
- Ruby ist keine statisch typisierte Sprache, hat aber Typen.
- Als objektorientierte Sprache behandelt Ruby alles als Objekt.
- Anders als bei Bash lassen sich Typen jenseits von Strings sicher verwenden.
total_lines = `wc -l my_file`.to_i # Ganzzahl mit der Zeilenanzahl der Datei half = total_lines.div 2 # Ganzzahldivision puts `head -n #{half} my_file` # Gibt die Hälfte der Datei aus
Funktion 4: Funktionale Komposition
- Ruby implementiert funktionale Operationen wie
map,select(Filter),reduceundflat_mapals Methoden. - Auf die Ausgabe eines Befehls kann
mapangewendet werden.puts `ls`.lines.map { |name| name.strip.length } # Gibt die Länge der Dateinamen aus
Funktion 5: Reguläre-Ausdruck-Matching
- In Ruby sind reguläre Ausdrücke ein eigener Typ, und Operationen dafür sind eingebaut.
- Zum Beispiel so kann man den Namen des aktuellen git-Branches abrufen:
current_branch_regex = /^\* (\S+)/ output_lines = `git branch`.lines output_lines.each do |line| if line =~ current_branch_regex # String- und Regex-Matching puts $1 # Gibt das Match der ersten Gruppe aus end end
Funktion 6: Einfache Threads
- Ruby macht den Umgang mit mehreren Threads sehr einfach
- Zum Beispiel nützlich, wenn mehrere Dateien gleichzeitig heruntergeladen werden sollen
(1..10).map do |i| # Iteration von 1 bis 10 Thread.new do `wget http://my_site.com/file_#{i}` # Variablen können im Befehl verwendet werden end end.each { |thread| thread.join } # do/end und geschweifte Klammern dienen demselben Zweck
Funktion 7: Eingebaute Datei- und Verzeichnisoperationen
- In Ruby werden alle Dateioperationen als Methoden der Klasse
Fileund Verzeichnisoperationen als Methoden der KlasseDirbereitgestellt. - Anders als bei Python kann man Dateien und Verzeichnisse auf konsistente Weise behandeln.
exists = File.exists? 'My File' # Methoden, die einen Booleschen Wert zurückgeben, enden auf '?' file_content = File.open('My File').read File.delete 'My File' # Klammern sind optional, wenn es nicht mehrdeutig ist
Fazit
- Wer komplexe Shell-Skripte ersetzen will, sollte Ruby in Betracht ziehen
- Das heißt natürlich nicht, dass man Bash komplett aufgeben sollte, aber bei komplexeren Aufgaben kann Ruby die bessere Wahl sein
- Auch mit Python, Perl oder JS ist das möglich, aber persönlich halte ich Ruby für die vollständigste und am einfachsten nutzbare Sprache
Meinung von GN⁺
- Ruby unterstützt sowohl objektorientierte als auch funktionale Programmierung und eignet sich damit für verschiedene Programmierstile.
- Im Vergleich zu Python folgt Ruby einem strengeren objektorientierten Paradigma.
- Beim Schreiben von Shell-Skripten treten die Vorteile von Ruby umso deutlicher hervor, je komplexer die Aufgaben werden.
- Rubys Threading-Funktionen erleichtern die Umsetzung paralleler Aufgaben.
- Datei- und Verzeichnisoperationen sind intuitiv und konsistent gestaltet, was die Produktivität erhöht.
3 Kommentare
Als Skriptsprache kann man das durchaus verwenden, haha. Ich kenne die Version zwar nicht, aber auf dem Mac ist es doch standardmäßig installiert, oder?!
Ruby, das ich einmal sehr geschätzt habe ... Ich hoffe, es bleibt wenigstens auf diese Weise(?) eine Sprache, die viel Liebe bekommt.
Hacker-News-Kommentare
binding.irboderbinding.prylässt sich in Skripten interaktiv debuggen.Pathnamebietet eine natürlichere API alsFile.Parallelwird Parallelverarbeitung noch unkomplizierter.