So verfolgen Sie die Ausführung von Befehlen im Shell -Skript mit Shell -Verfolgung
- 3893
- 742
- Aileen Dylus
In diesem Artikel der Shell -Skript -Debugging -Serie werden wir den dritten Shell -Skript -Debugging -Modus erklären, der Shell -Verfolgung ist und einige Beispiele betrachten, um zu demonstrieren, wie es funktioniert und wie es verwendet werden kann.
Der vorherige Teil dieser Serie beleuchtet deutlich auf die beiden anderen Shell -Skript -Debugging -Modi: ausführlicher Modus Und Syntaxprüfung Modus mit leicht verständlichen Beispielen, wie das Shell-Skript-Debuggen in diesen Modi aktiviert werden kann.
- So aktivieren Sie den Shell -Skript -Debugging -Modus unter Linux - Teil 1
- So führen Sie die Syntax -Überprüfung des Debugging -Modus in Shell -Skripten aus - Teil 2
Die Shell -Verfolgung bedeutet einfach, die Ausführung der Befehle in einem Shell -Skript zu verfolgen. Verwenden Sie zum Einschalten der Schalenverfolgung die -X
Debugging -Option.
Dadurch wird die Shell angewiesen, alle Befehle und ihre Argumente zum Terminal anzuzeigen, sobald sie ausgeführt werden.
Wir werden die verwenden sys_info.Sch
Shell -Skript unten, das kurz das Datum und die Uhrzeit des Systems, die Anzahl der angemeldeten Benutzer und die Systemüberzeiten des Systems druckt. Es enthält jedoch Syntaxfehler, die wir finden und korrigiert werden müssen.
#!/bin/bash #Script zum Drucken von Kurzsystemen info root_id = "0" Date = "Datum" no_users = "Who | wc -l" Uptime = "Uptime" check_root () if ["$ uid" -ne "$ root_id "]; dann echo "Sie dürfen dieses Programm nicht ausführen!"Beenden 1; print_sys_info () echo" Systemzeit: $ Date "echo" Anzahl der Benutzer: $ No_User "echo" System -Betrieb: $ Uptime check_root print_sys_info exit 0
Speichern Sie die Datei und lassen Sie das Skript ausführbar. Das Skript kann nur von Root ausgeführt werden. Verwenden Sie daher den Sudo -Befehl, um es wie unten auszuführen:
$ chmod +x sys_info.sh $ sudo bash -x sys_info.SchShell -Verfolgung - Fehler im Skript anzeigen
Aus der obigen Ausgabe können wir feststellen, dass ein Befehl zuerst ausgeführt wird, bevor sein Ausgang als Wert einer Variablen ersetzt wird.
Zum Beispiel die Datum wurde zuerst ausgeführt und die Ausgabe wurde als Wert der Variablen ersetzt DATUM.
Wir können die Syntaxprüfung durchführen, um nur die Syntaxfehler wie folgt anzuzeigen:
$ sudo bash -n sys_info.SchSyntaxprüfung im Skript
Wenn wir uns das Shell -Skript kritisch ansehen, werden wir erkennen, dass die wenn Anweisung
fehlt eine Schließung fi
Wort. Lassen Sie es uns daher hinzufügen, und das neue Skript sollte jetzt wie unten aussehen:
#!/bin/bash #Script zum Drucken von Kurzsystemen info root_id = "0" Date = "Datum" no_users = "Who | wc -l" Uptime = "Uptime" check_root () if ["$ uid" -ne "$ root_id "]; dann echo "Sie dürfen dieses Programm nicht ausführen!"Exit 1; fi print_sys_info () echo" Systemzeit: $ Date "echo" Anzahl der Benutzer: $ no_users "echo" System -Betriebszeit: $ optim
Speichern Sie die Datei erneut und rufen Sie sie als Root auf und führen Sie eine Syntaxprüfung durch:
$ sudo bash -n sys_info.SchFühren Sie Syntax -Check in Shell -Skripte durch
Das Ergebnis unserer obigen Syntax -Überprüfungsoperation zeigt nach wie vor, dass unser Skript noch einen Fehler aufweist Zeile 21. Wir haben also noch eine Syntaxkorrektur zu tun.
Wenn wir das Skript noch einmal analytisch durchsehen, wird der Fehler eingeschaltet Zeile 21 ist auf ein fehlendes doppeltes Angebot zurückzuführen (”)
im letzten Echobefehl innerhalb der print_sys_info
Funktion.
Wir werden das schließende Doppelangebot in die hinzufügen Echo Befehl und speichern Sie die Datei. Das geänderte Skript ist unten:
#!/bin/bash #Script zum Drucken von Kurzsystemen info root_id = "0" Date = "Datum" no_users = "Who | wc -l" Uptime = "Uptime" check_root () if ["$ uid" -ne "$ root_id "]; dann echo "Sie dürfen dieses Programm nicht ausführen!"Exit 1; fi print_sys_info () echo" Systemzeit: $ Date "echo" Anzahl der Benutzer: $ no_users "echo" system optim
Überprüfen Sie nun das Skript noch einmal syntaktisch.
$ sudo bash -n sys_info.Sch
Der obige Befehl erzeugt keine Ausgabe, da unser Skript jetzt syntaktisch korrekt ist. Wir können auch die Ausführung des Skripts zum zweiten Mal verfolgen und es sollte gut funktionieren:
$ sudo bash -x sys_info.SchAusführung von Spuren -Shell -Skript -Skript
Führen Sie nun das Skript aus.
$ sudo ./sys_info.SchShell -Skript, um Datum, Uhrzeit und Betriebszeit anzuzeigen
Bedeutung der Ausführung von Shell -Skript -Ausführungen
Die Verfolgung von Shell -Skripts hilft uns, Syntaxfehler und vor allem logische Fehler zu identifizieren. Zum Beispiel die check_root
Funktion in der sys_info.Sch
Shell -Skript, das feststellen soll, ob ein Benutzer root ist oder nicht, da das Skript nur vom Superuser ausgeführt werden darf.
check_root () if ["$ uid" -ne "$ root_id"]; dann echo "Sie dürfen dieses Programm nicht ausführen!"Beenden Sie 1; fi
Die Magie hier wird von der gesteuert wenn Anweisung
Ausdruck ["$ Uid" -ne "$ root_id"]
, Sobald wir den geeigneten numerischen Operator nicht verwenden (-ne
In diesem Fall, was nicht gleich bedeutet), haben wir einen möglichen logischen Fehler.
Angenommen, wir haben verwendet -Gl
(bedeutet gleich), dies würde es jedem Systembenutzer und dem Stammbenutzer ermöglichen, das Skript auszuführen, daher ein logischer Fehler.
check_root () if ["$ uid" -eq "$ root_id"]; dann echo "Sie dürfen dieses Programm nicht ausführen!"Beenden Sie 1; fi
Notiz: Wie wir uns bereits zu Beginn dieser Serie angesehen haben, kann der Befehl Set Shell integriert werden, das Debuggen in einem bestimmten Abschnitt eines Shell-Skripts aktivieren kann.
Daher hilft uns die folgende Zeile, diesen logischen Fehler in der Funktion zu finden, indem wir ihre Ausführung verfolgen:
Das Skript mit einem logischen Fehler:
#!/bin/bash #Script zum Drucken von Kurzsystemen info root_id = "0" Date = "Datum" no_users = "Wer | wc -l" Uptime = "Uptime" check_root () if ["$ uid" -eq "$ root_id "]; dann echo "Sie dürfen dieses Programm nicht ausführen!"Beenden 1; fi print_sys_info () echo" Systemzeit: $ Date "echo" Anzahl der Benutzer: $ no_users "echo" system optim ; set +x; print_sys_info beenden 0
Speichern Sie die Datei und rufen Sie das Skript auf. Wir können sehen, dass ein regulärer Systembenutzer das Skript ohne ausführen kann sudo Wie in der folgenden Ausgabe. Dies liegt daran, dass der Wert von BENUTZER-ID Ist 100 das ist nicht gleich der Wurzel Root_id welches ist 0.
$ ./sys_info.SchFühren Sie das Shell -Skript ohne sudo aus
Nun, das ist es vorerst, wir sind am Ende der Shell-Skript-Debugging-Serie gekommen. Das folgende Antwortformular kann verwendet werden, um Fragen oder Feedback in Bezug auf diesen Leitfaden oder die gesamte 3-teilige Serie zu beantworten.
- « Fix Fehler 2003 (HY000) kann auf '127 keine Verbindung zum MySQL -Server herstellen.0.0.1 '(111)
- 3 Nützliche GUI- und terminalbasierte Linux -Festplatten -Scan -Tools »