Hören Sie auf, Ihren Shell-Skripten zu vertrauen: Warum ShellCheck das Tool ist, das Ihnen fehlt
ShellCheck ist ein Code-Prüfer, der Fehler, Inkompatibilitäten und andere Probleme in Shell-Skripten erkennt. Es ist wertvoll, weil nur wenige ähnliche Werkzeuge existieren und Shell-Programmierung besonders fehleranfällig sein kann, mit Portabilitätsproblemen und unterschiedlichen Syntaxänderungen, die im Laufe der Zeit eingeführt wurden.
Ich habe ShellCheck auf meine eigenen Skripte und einige Skripte von Drittanbietern losgelassen und, wenig überraschend, hat es eine ganze Reihe von Problemen gefunden. Deshalb würde ich empfehlen, dass du dasselbe tust!
Was ist ShellCheck?
Ein Werkzeug zur statischen Analyse von Shell-Skripten (und Website)
ShellCheck bezeichnet sich selbst als ein „Shell-Skript-Statische-Analyse-Tool“, was bedeutet, dass Sie es in einem Terminal ausführen und es Ihnen sagt, wie gut Ihre Shell-Skripte sind. Genauer gesagt, erledigt es seine Aufgabe ausschließlich durch das Betrachten des Quellcodes Ihrer Skripte, nicht durch deren tatsächliches Ausführen.
Das Programm wird Sie auf verschiedene Probleme in Ihrem Code hinweisen, einschließlich:
- Syntaxfehler und Probleme
- Häufige semantische Fehler
- Inkompatibilitäten
- Stilprobleme, die möglicherweise keine Probleme verursachen, aber zu weniger gut lesbarem Code führen können
Zum Beispiel hier ist ein kleines Shell-Skript, repeat.sh, das sein erstes Argument ausgibt:
#!/bin/bash
echo $1
Man könnte denken, dass bei einem so einfachen Skript wenig schiefgehen kann, aber ShellCheck wird diese Fehlvorstellung korrigieren:
Wie benutzt man es?
Befehlszeilen- und Webversionen sind verfügbar
Zunächst einmal hat ShellCheck eine hervorragende Web-App, die die neueste Version des Codes spiegelt und es Ihnen ermöglicht, sie auszuprobieren, ohne etwas zu installieren. Ich würde nicht empfehlen, sie langfristig zu verwenden, da sie viel weniger praktisch ist, aber sie ist eine großartige Möglichkeit, die Software zu testen und zu sehen, was sie macht.
Da Ihre lokale Version möglicherweise nicht die allerneueste ist, könnten Sie Unterschiede zwischen dieser und der Webversion feststellen. Stellen Sie sicher, dass Sie Ihren Paketmanager verwenden, um Ihre lokale Version auf dem neuesten Stand zu halten.
Wenn Sie sich entscheiden, ShellCheck wirklich auszuprobieren, beginnen Sie mit den Installationsanweisungen für Ihre Plattform. Auf Debian/Ubuntu ist es sudo apt install shellcheck; auf Fedora verwenden Sie dnf install ShellCheck. Wenn Sie Homebrew haben, führen Sie brew install shellcheck aus.
Sobald es installiert ist, können Sie das Tool mit dem Befehl shellcheck ausführen. Ohne Argumente erhalten Sie die Nutzungsinformationen:
Versuchen Sie nun, ShellCheck auf einer Skriptdatei auszuführen, um einige nützliche Ergebnisse zu sehen, z. B.:
shellcheck script.sh
Wenn Ihr Skript irgendwelche Probleme enthält, sollten Sie beachten, dass ShellCheck mehrere nützliche Informationen bereitstellt. Zum Anfang wird es jedes Problem, das es findet, beschreiben, mit dem Dateinamen, der Zeilennummer und der genauen Position in der Zeile, z. B.:
„SC2086“ ist ein eindeutiger Fehlercode, den ShellCheck als Referenz verwendet. Die vollständige Liste von über 500 Codes ist im Wiki von ShellCheck verfügbar.
Neben der spezifischen Fehlermeldung bietet ShellCheck eine vorgeschlagene Alternative sowie am Ende eine Reihe von Referenzlinks zu jedem einzelnen Problem. Diese Seiten geben viel mehr Details, einschließlich warum Menschen einen bestimmten Fehler machen könnten und ob es Ausnahmen von der Regel gibt.
ShellCheck hat einige Optionen, die Sie verwenden können, um seine Funktionsweise anzupassen. Die Option --format=json liefert Ihnen eine Ausgabe in einem strukturierteren Format, falls Sie diese weiterverarbeiten möchten. Mit --severity=error werden nur Fehler gemeldet; Stil-, Informations- und Warnungstypen werden ignoriert. Und die Optionen --include= und --exclude= können von einer durch Kommas getrennten Liste spezifischer Codes gefolgt werden, um den Umfang zu verfeinern. Sie können das führende "SC" weglassen, wenn Sie möchten.
Welche Arten von Problemen kann ShellCheck aufdecken?
Der beste Weg, es herauszufinden, ist es auszuprobieren
Viele Dinge können bei Shell-Skripten schiefgehen. Shell-Skripte werden fast immer interpretiert, und die Sprache ist in der Regel nachsichtig, mit lockerer (oder nicht vorhandener) Typisierung. Es gibt viele Syntaxunterschiede zwischen den Versionen, und alternative Syntaxen werden beibehalten, um Rückwärtskompatibilität zu gewährleisten. Darüber hinaus gibt es verschiedene Shells - wie Bash und Zsh - die mehr oder weniger austauschbar sind, dennoch aber einige Unterschiede behalten.
ShellCheck zielt darauf ab, all diese Probleme zu entdecken, daher ist es ziemlich umfassend. Hier ist ein Beispiel aus einem meiner eigenen Shell-Skripte:
Dies hebt ein sehr häufiges Problem hervor: die Verwendung von veralteter Syntax. Während die Backtick-Syntax (``) für die Befehlsersetzung funktioniert, ist sie nicht ideal; einerseits erlaubt sie keine geschachtelten Befehle. Die modernere $(...)-Variante ist POSIX-konform, daher gibt es keinen guten Grund, sie zu vermeiden.
ShellCheck hat auch meine nachlässige Verwendung von $0 ohne Anführungszeichen bemerkt. Wie die Informationsnachricht erklärt, hilft dies, Erweitungen zu verhindern, die ich wahrscheinlich nicht erwarte. Diese beiden Probleme sind eher stilistischer Natur, daher sind sie nicht allzu besorgniserregend, aber der nächste Befund ist schwerwiegender:
Dies ist eine echte Warnung—achten Sie auf den leichten Farbunterschied—weil sie ein grundlegendes Missverständnis aufzeigt: Die Reihenfolge von 2>&1 und anderen Umleitungen ist wichtig. Meine fehlerhafte Version wird auf der Kommandozeile weiterhin Fehler anzeigen, selbst wenn ich stdout nach /dev/null umleite, wegen der Reihenfolge.
Das ist genau die Art von Problem, die schwer zu erkennen ist: Es sollte bei normaler Programmausführung nicht auftreten, und es könnte sogar genau das sein, was ich beabsichtigt habe, es ist nur unwahrscheinlich. Zum Glück ist ShellCheck intelligent genug, um mich auf diesen technisch korrekten, aber seltsamen Code hinzuweisen!
Um mich ein wenig besser zu fühlen, habe ich einige Shell-Skripte überprüft, die richtige, öffentliche Open-Source-Projekte verwenden. Zum Glück für mich bin ich nicht der Einzige, der schlampige Shell-Skripte produziert! Der Bericht für das ausgezeichnete bashblog-Tool enthielt viele Probleme. Es ist natürlich ein viel größeres Skript, aber es hilft, die Probleme zu veranschaulichen, die ShellCheck erfassen kann.
Die Qualität Ihrer Shell-Skripte ist ebenfalls wichtig
Da Shell-Skripte oft privat sind oder geschrieben werden, um eine einmalige Aufgabe zu erledigen, ist es leicht, nachlässig zu werden und wichtige Probleme, sogar Fehler, zu übersehen. Aber wir sollten Shell-Skripte mit genauso viel Sorgfalt behandeln wie andere Arten von Programmen.
Shell-Skripte können sich im Laufe der Zeit verändern und Zwecke erfüllen, für die sie ursprünglich nicht gedacht waren. Man weiß nie, wo der eigene Code letztendlich landen wird oder wer ihn eines Tages benutzen könnte, deshalb sollte man sicherstellen, dass er so wasserdicht wie möglich ist, solange das noch einfach zu machen ist.










