Gibt es eine Möglichkeit, ein Shell-Skript auszuführen , bei dem die Befehle wiederholt werden, ohne sie jedoch tatsächlich auszuführen?
Angenommen, ein Skript entfernt eine Datei, deren Name in einer Variablen gespeichert ist:
#!/bin/bash
set -v
FN="filename"
rm -f ${FN}
Beim Hinzufügen set -v
werden die folgenden Befehle vor der Ausführung wiedergegeben:
$ ./scr.sh
FN="filename"
rm -f ${FN}
Jetzt möchte ich den Ablauf dieses Skripts sehen, ohne die Datei tatsächlich zu entfernen. IOW, ich möchte Auswirkungen auf die externe Umgebung und das Dateisystem verhindern. Ist das möglich?
Ich könnte alle Befehle mit einem echo
Befehl umschließen, aber es ist anstrengend für ein langes Skript.
linux
bash
shell-script
ysap
quelle
quelle
Antworten:
Es gibt keine Möglichkeit, ein Skript zu durchlaufen, um zu sehen, wie es ausgeführt wird, ohne dies tatsächlich zu tun. In Ihrem Beispiel gibt es keine
if
Anweisungen oder Schleifen. In echten Skripten gibt es jedoch oft viele bedingte Anweisungen. Welcher Zweig genommen wird, hängt oft davon ab, was passiert ist, als die Shell den vorherigen Befehl ausgeführt hat. Wenn der Befehl nicht ausgeführt wird, kann die Shell nicht wissen, welche Ausgabe sie generiert hätte oder wie der Rückkehrcode gewesen wäre, von dem die nächste bedingte Verzweigung oder Zuweisungsanweisung abhängen könnte.Wenn der Punkt ist, dass Sie ein Skript überprüfen und wissen möchten, was es tut, bevor Sie es ausführen, ist das keine schlechte Idee. Realistisch gesehen ist der beste Weg, dies zu tun, das Durchsuchen der Datei mit
less
odervi
ähnlichem.Hinzugefügt
Wenn Sie ein Skript entwickeln und es beim ersten Mal durchgehen möchten, die Logik testen, aber keinen Schaden anrichten, wenn Sie einen Fehler haben, kann ich häufig nur Änderungen vornehmen die Aussagen, die Schaden anrichten könnten, indem sie
echo
auf die Vorderseite geklebt werden .Dies funktioniert häufig in typischen realen Skripten, da (a) das Generieren der Listen von Elementen, über die Sie iterieren, oder der Wert, auf den Sie eine Variable festlegen, häufig generiert werden kann, ohne das Dateisystem zu ändern, und (b) dies normalerweise ausreicht Angenommen, wenn Sie den Befehl ausführen, ist er erfolgreich.
quelle
trap read debug
dem nach jeder ausgeführten Zeile ein Lesevorgang ausgeführt wird, und Sie können es dann langsam mit der Eingabetaste durchlaufen (dies ist nützlich, wenn Sie ein wirklich langes Skript haben und testen möchten es zum ersten Mal).Ich denke, Sie müssen ein Echo abgeben. Wenn Sie den Befehl jedoch in eine Variable einfügen, können Sie ihn ein- und ausschalten. Der Befehl kann auch eine Funktion sein und so ausgefeilt sein, wie Sie möchten.
quelle
D=eval
im Live-Teil verwenden. Aber schöne Antwort!Sie können den Fluss mit der Option -x für bash verfolgen, die Befehle werden jedoch weiterhin ausgeführt.
Das Beste, was Sie tun können, ist, einfach ein Echo zu setzen oder die Befehle zu kommentieren, die externe Effekte wie rm haben. Zumindest müssten Sie nicht jede Zeile ändern.
quelle
Ich kenne keine bestimmte Methode für den Trockenlauf, aber wir können einige Vorsichtsmaßnahmen treffen, um ein unbekanntes Skript zu verstehen.
bash -n <script>
für die Syntaxprüfung . Aus dem gnu bash-Handbuch https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html-n Read commands but do not execute them; this may be used to check a script for syntax errors. This option is ignored by interactive shells.
alias rm="rm -i" alias cp="cp -i" alias mv="mv -i"
Für Stream-Editoren wie sedsed -i
(-i ändert die vorhandene Datei ohne -i führt einen Probelauf für sed durch, überprüfen Sie die Manpage auf Details) kann den vollständigen Befehl kopieren und ausführen. Kurz vor dem eigentlichen Befehl wird die Ausgabe auf dem Bildschirm angezeigt. Warten Sie dann mit dem Befehl, bis die Benutzereingabe fortgesetzt wird. Beispielsed -i <pattern>
Ersetzen Sie es durchsed <pattern> read -p "Press any key..." sed -i <pattern>
Es wird auch immer empfohlen, Sicherungspunkte in Ihrem System zu behalten, damit im Notfall Daten wiederhergestellt werden können.
quelle
Haben
set –n
oder Anfügenn
zu Ihrem bestehendenset –v
Befehl. Da dies jedoch dazu führt, dass die Shell keine Befehle auswertet, auch nichtif
oderwhile
, erhalten Sie möglicherweise keine allzu gute Sicht auf den Betriebsablauf.quelle
Hier ist ein kleines Konstrukt, das ich gerne benutze:
quelle
Wenn Sie verhindern möchten, dass Änderungen vorgenommen werden, können Sie das Skript als Benutzer ohne Berechtigungen ausführen:
In Ihrem Beispiel wird dies
FN="filename"
wie gewohnt ausgeführt. Während der Befehlrm -f ${FN}
auch technisch ausgeführt wird, geschieht nichts, wenn niemand über die erforderlichen Berechtigungen zum Löschen der Datei verfügt.Dies führt natürlich zu Problemen mit dem bedingten Workflow. Die Tatsache, dass der
rm
Befehl fehlgeschlagen ist, kann sich auf weitere Teile des Skripts auswirken.quelle