So verfolgen Sie die Ausführung von Befehlen im Shell -Skript mit Shell -Verfolgung

So verfolgen Sie die Ausführung von Befehlen im Shell -Skript mit Shell -Verfolgung

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.

  1. So aktivieren Sie den Shell -Skript -Debugging -Modus unter Linux - Teil 1
  2. 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.Sch 
Shell -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.Sch 
Syntaxprü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.Sch 
Fü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.Sch 
Ausführung von Spuren -Shell -Skript -Skript

Führen Sie nun das Skript aus.

$ sudo ./sys_info.Sch 
Shell -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.Sch 
Fü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.