GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Einzeiler vs. Drehbuch?

Ich habe viele Fragen und Antworten und Kommentare bemerkt, die Verachtung (und manchmal sogar Angst davor) zum Ausdruck bringen, Skripte anstelle von Einzeilern zu schreiben. Also, ich würde gerne wissen:

  • Wann und warum sollte ich eher ein eigenständiges Skript als einen „Einzeiler“ schreiben? Oder umgekehrt?

  • Was sind die Anwendungsfälle und Vor- und Nachteile von beiden?

  • Sind einige Sprachen (z. B. awk oder perl) besser für Einzeiler geeignet als andere (z. B. Python)? Wenn ja, warum?

  • Ist es nur eine Frage der persönlichen Präferenz oder gibt es gute (also objektive) Gründe, unter bestimmten Umständen das eine oder andere zu schreiben? Was sind diese Gründe?

Definitionen

  • one-liner :jede Folge von Befehlen, die direkt in eine Shell-Befehlszeile eingegeben oder eingefügt werden . Häufig mit Pipelines und/oder der Verwendung von Sprachen wie sed , awk , perl , und/oder Tools wie grep oder cut oder sort .

    Die direkte Ausführung auf der Kommandozeile ist das bestimmende Merkmal – Länge und Formatierung spielen keine Rolle. Ein „Einzeiler“ kann sich in einer einzigen Zeile befinden oder mehrere Zeilen umfassen (z. B. sh for loop oder eingebetteter awk- oder sed-Code mit Zeilenvorschüben und Einrückungen zur Verbesserung der Lesbarkeit).

  • script :jede Folge von Befehlen in jeder interpretierten Sprache(n), die in einer Datei gespeichert werden , und dann ausgeführt. Ein Skript kann vollständig in einer Sprache geschrieben sein, oder es kann ein Shell-Skript-Wrapper um mehrere „Einzeiler“ sein, die andere Sprachen verwenden.

Ich habe meine eigene Antwort (die ich später posten werde), aber ich möchte, dass dies eine kanonische Frage und Antwort zu diesem Thema wird, nicht nur meine persönliche Meinung.

Akzeptierte Antwort:

Eine weitere Antwort, die auf praktischer Erfahrung basiert.

Ich würde einen Einzeiler verwenden, wenn es sich um „Wegwerf“-Code handeln würde, den ich direkt an der Eingabeaufforderung schreiben könnte. Ich könnte zum Beispiel Folgendes verwenden:

for h in host1 host2 host3; do printf "%s\t%s\n" "$h" "$(ssh "$h" uptime)"; done

Ich würde ein Skript verwenden, wenn ich beschließe, dass es sich lohnt, den Code zu speichern. An dieser Stelle würde ich am Anfang der Datei eine Beschreibung hinzufügen, wahrscheinlich eine Fehlerprüfung hinzufügen und sie vielleicht sogar in ein Code-Repository zur Versionierung einchecken. Wenn ich zum Beispiel beschließe, dass die Überprüfung der Betriebszeit einer Reihe von Servern eine nützliche Funktion ist, die ich immer wieder verwenden würde, könnte der obige Einzeiler folgendermaßen erweitert werden:

#!/bin/bash
# Check the uptime for each of the known set of hosts
########################################################################
#
hosts=(host1 host2 host3)

for h in "${hosts[@]}"
do
    printf "%s\t" "$h"
    uptime=$(ssh -o ConnectTimeout=5 -n "$h" uptime 2>/dev/null)
    printf "%s\n" "${uptime:-(unreachable)}"
done

Verallgemeinernd könnte man sagen

  • Einzeiler

    • Einfacher Code (d. h. nur „ein paar“ Anweisungen), der für einen bestimmten einmaligen Zweck geschrieben wurde
    • Code, der bei Bedarf schnell und einfach geschrieben werden kann
    • Einwegcode
  • Skript

    • Code, der (wahrscheinlich) mehr als ein- oder zweimal verwendet wird
    • Komplexer Code, der mehr als „ein paar“ Anweisungen erfordert
    • Code, der von anderen gepflegt werden muss
    • Code, der von anderen verstanden werden soll
    • Code, der unbeaufsichtigt ausgeführt werden soll (z. B. von cron )

Ich sehe, dass eine ganze Reihe von Fragen hier auf unix.SE nach einem Einzeiler fragen, um eine bestimmte Aufgabe auszuführen. Unter Verwendung meiner obigen Beispiele denke ich, dass das zweite viel verständlicher ist als das erste, und daher können die Leser mehr daraus lernen. Eine Lösung kann leicht von der anderen abgeleitet werden, daher sollten wir im Interesse der Lesbarkeit (für zukünftige Leser) wahrscheinlich vermeiden, Code für etwas anderes als die trivialsten Lösungen in eine Zeile zu quetschen.

Verwandte:Bash/Shell-Pfadnamenerweiterung für mkdir, touch usw.?
Linux
  1. Konvertieren Ihres Python 2-Codes in Python 3

  2. Möglichkeit zum Einbetten einer ausführbaren Binärdatei in ein Shell-Skript ohne zusätzliche Tools?

  3. Unfähig, den richtigen Exit-Code aus einem Skript zu erhalten?

  4. Linux-Betriebssystemdienst „scsi_reserve“

  5. So testen Sie ein PHP-Skript

35 Bash-Skriptbeispiele

So führen Sie ein Bash-Skript aus

Quellcode von Netstat?

Ruby-Skript als Dienst

Aktuelles Verzeichnis des Shell-Skripts?

Bash-Skript-Musterabgleich