3 Punkte von GN⁺ 2023-11-24 | 1 Kommentare | Auf WhatsApp teilen

Interessante Binärdateien auf Unix-Systemen

  • Auf Unix-Systemen gibt es Binärdateien, deren Name aus einem einzelnen Symbol besteht.
  • Führt man den Befehl /bin/[ aus, kann man ein Programm mit dem Namen [ sehen.
  • [ und test verweisen auf dieselbe Binärdatei, und beide Befehle erfüllen tatsächlich dieselbe Funktion.

Verwendung des Programms test und von [

  • Das Programm test wird in der Shell verwendet, um Ausdrücke auszuwerten.
  • Es wird für String-Vergleiche, Zahlenvergleiche und die Prüfung von Dateibedingungen genutzt.
  • test nimmt Argumente entgegen, wertet einen Ausdruck aus und gibt bei wahr 0, bei falsch 1 zurück.

Warum es zwei Befehle gibt

  • Warum es sowohl test als auch [ gibt, ist nicht ganz klar, vermutlich dient es aber der besseren Lesbarkeit.
  • Mit dem Befehl [ lassen sich Bedingungen sauberer ausdrücken als mit test.
  • Bei der Verwendung von [ muss das letzte Argument des Befehls mit ] enden.

Unterschied zwischen Built-ins und externen Binärdateien

  • Da test und [ in Shell-Skripten häufig verwendet werden, sind sie in den meisten Shells als Built-ins implementiert.
  • Je nachdem, ob man ein Built-in oder eine externe Binärdatei verwendet, kann sich das Verhalten unterscheiden; Unterschiede gibt es auch zwischen den Shells selbst.

Verwendung und Unterschiede von [[

  • [[ ist eine Bash-Erweiterung, die die Verwendung von [ ersetzt.
  • Als Built-in kann [[ die grundlegenden Regeln der Sprache innerhalb von Ausdrücken verändern.
  • Bei String-Vergleichen behandelt [[ Glob-Patterns als Literale und kann dadurch andere Ergebnisse liefern.

Auswahl beim Schreiben von Shell-Skripten

  • Wenn man portable Shell-Skripte schreiben will, sollte man [ verwenden.
  • Schreibt man ein Bash-spezifisches Skript, bietet [[ mehr Funktionen.

Kombination von Shell-Ausdrücken und test-Ausdrücken

  • Die Shell besitzt mit !, && und || eigene Ausdrücke.
  • test-Ausdrücke und Shell-Ausdrücke lassen sich in einem einzigen Befehl kombinieren.

Meinung von GN⁺

Der wichtigste Punkt dieses Artikels ist, dass [ und test auf Unix-Systemen als zwei unterschiedliche Befehle mit derselben Funktion existieren, was vermutlich der besseren Lesbarkeit und Effizienz von Shell-Skripten dient. Diese Information kann für angehende Software Engineers hilfreich sein, wenn sie Shell-Skripte schreiben oder verstehen, und sie hilft auch dabei, die Funktionsweise von Shell-Skripten sowie die Unterschiede zwischen verschiedenen Shells zu begreifen. Interessant ist der Text außerdem, weil er zeigt, wie grundlegende Werkzeuge des Shell-Scripting in unterschiedlichen Formen genutzt werden können, und weil er die Komplexität und Flexibilität der Shell-Programmierung gut sichtbar macht.

1 Kommentare

 
GN⁺ 2023-11-24
Hacker-News-Kommentare
  • Danksagung des ursprünglichen Autors und Vorschlag zur Titelkorrektur

    Der ursprüngliche Autor bedankt sich dafür, dass der Beitrag beliebt geworden ist, und schlägt vor, dem Titel das Jahr hinzuzufügen und das Wort "test" nicht großzuschreiben, weil sich "test" auf den tatsächlichen Befehl bezieht.

  • Geschichte des Bourne-Shell-Befehls "test" und persönliche Vorliebe

    Es wird erklärt, dass die Bourne-Shell in einer Zeit ohne IDEs entstand und deshalb der Befehl "test" ohne Klammern oder eckige Klammern verwendet wurde. Persönlich wird die Form mit "test" gegenüber der Form mit eckigen Klammern bevorzugt.

  • Beispiel für Bedingungen ohne Verwendung eines if-Blocks

    Es wird gezeigt, wie sich Bedingungen ohne if-Block einfach schreiben lassen, und ein Beispiel wird gegeben, bei dem Debug-Ausgaben bedingt auf stderr ausgegeben werden.

  • Kombination von if-Blöcken und gewöhnlichen Befehlen

    Es wird gezeigt, dass ein if-Block gewöhnliche Befehle testen kann; als Beispiel wird eine Logsuche mit dem Befehl grep genannt.

  • Überlegungen zum Einsatz logischer Operationen im test-Befehl

    Es werden Überlegungen dazu geäußert, ob man logische Operationen innerhalb des test-Befehls verwenden oder lieber separate Bedingungen schreiben sollte. Wenn es kein Performance-Problem gibt, gibt es für beide Ansätze gute Gründe.

  • Vorteile der Verwendung des Befehls "test" und die Bequemlichkeit von "man test"

    Es wird vertreten, dass es seit einigen Jahren besser sei, statt eckiger Klammern direkt den Befehl "test" zu verwenden. Das unterstreicht, dass "test" einfach ein Befehl ist, und erklärt, dass man test praktischer ist, als in man bash zu suchen.

  • Vorsicht beim Verhalten mit einem einzelnen Argument bei [ und test

    Es wird gewarnt, dass beim Prüfen, ob eine Variable nicht leer ist, unerwartete Ergebnisse entstehen können, wenn die Variable nicht in Anführungszeichen gesetzt wird. Es wird betont, dass die Variable in Anführungszeichen gesetzt werden sollte.

  • Unterschied zwischen /bin/[ und /bin/test unter Linux und NetBSD

    Es wird geteilt, dass sich /bin/[ und /bin/test unter Linux unterscheiden, unter NetBSD jedoch identisch sind.

  • Teilen von Blog-Links zu einer tieferen Auseinandersetzung mit test/[/[[ und den Merkwürdigkeiten der Shell

    Es werden Dokumente und Blog-Links geteilt, die ein tieferes Verständnis von test, [, [[ sowie verschiedenen Eigenheiten der Shell vermitteln.

  • Hinweis, dass [[ bash-spezifisch ist, und Empfehlung zu [[, wenn bash sicher verwendet wird

    Es wird erwähnt, dass [[ bash-spezifisch ist, und geraten, [[ zu verwenden, wenn sicher ist, dass bash eingesetzt wird.

  • Verwirrung über die Wahrnehmung, dass [ kein Teil der bash-Skriptsprache ist

    Es wird ausgedrückt, dass es verwirrend war zu verstehen, dass [ kein Teil der bash-Skriptsprache, sondern einfach ein Programm ist, und es wird um eine Erklärung dazu gebeten.

  • Starke Meinung zur Shell und Ablehnung der Verwendung von [

    Es wird eine starke Meinung vertreten, dass man [ nicht verwenden und nur "test" benutzen sollte. Es wird betont, dass [ wie Sprachsyntax aussieht, in Wirklichkeit aber ein Programm ist, und es wird argumentiert, dass man für String-Auswertungen die case-Anweisung verwenden sollte.