Können Sie ein Shell-Skript während der Ausführung bearbeiten und die Änderungen wirken sich auf das ausgeführte Skript aus?
Ich bin neugierig auf den speziellen Fall eines csh-Skripts, bei dem Batch eine Reihe verschiedener Build-Varianten ausführt und die ganze Nacht ausgeführt wird. Wenn mir während der Operation etwas einfällt, möchte ich zusätzliche Befehle hinzufügen oder nicht ausgeführte auskommentieren.
Wenn nicht möglich, gibt es eine Shell oder einen Batch-Mechanismus, der mir dies ermöglicht?
Natürlich habe ich es versucht, aber es wird Stunden dauern, bis ich sehe, ob es funktioniert hat oder nicht, und ich bin gespannt, was hinter den Kulissen passiert oder nicht.
Antworten:
Skripte funktionieren nicht so. Die ausführende Kopie ist unabhängig von der Quelldatei, die Sie bearbeiten. Wenn das Skript das nächste Mal ausgeführt wird, basiert es auf der zuletzt gespeicherten Version der Quelldatei.
Es kann ratsam sein, dieses Skript in mehrere Dateien aufzuteilen und einzeln auszuführen. Dies reduziert die Ausführungszeit bis zum Ausfall. (dh teilen Sie den Stapel in ein Build-Flavour-Skript auf und führen Sie jedes einzeln aus, um festzustellen, welches die Probleme verursacht).
quelle
Es wirkt sich zumindest auf meine Umgebung aus, aber auf sehr unangenehme Weise . Siehe diese Codes. Erstens
a.sh
:b.sh
::Machen
In meinem Fall ist die Ausgabe immer:
(Natürlich ist es viel besser, es zu automatisieren, aber das obige Beispiel ist lesbar.)
[bearbeiten] Dies ist unvorhersehbar und daher gefährlich. Die beste Problemumgehung besteht darin , wie hier beschrieben , alle in eine Klammer zu setzen und vor der schließenden Klammer "exit" zu setzen . Lesen Sie die verknüpfte Antwort gut durch , um Fallstricke zu vermeiden.
[hinzugefügt] Das genaue Verhalten hängt von einem zusätzlichen Zeilenumbruch ab und möglicherweise auch von Ihrem Unix-Geschmack, Dateisystem usw. Wenn Sie nur einige Einflüsse sehen möchten, fügen Sie b.sh einfach vorher und / oder nachher "echo foo / bar" hinzu die "gelesene" Zeile.
quelle
b.sh
indem Sie 10 Zeilen Echo foo / bar / baz hinzufügen. Der Kern der Antworten von dave4220 und mir ist, dass der Effekt nicht leicht vorherzusagen ist. (Übrigens bedeutet das Substantiv "Zuneigung" "Liebe" =)Versuchen Sie dies ... erstellen Sie eine Datei mit dem Namen
bash-is-odd.sh
:Das zeigt, dass Bash tatsächlich das Skript "wie du gehst" interpretiert. In der Tat führt das Bearbeiten eines Skripts mit langer Laufzeit zu unvorhersehbaren Ergebnissen, dem Einfügen zufälliger Zeichen usw. Warum? Da Bash von der letzten Byteposition liest, verschiebt das Bearbeiten die Position des aktuell gelesenen Zeichens.
Bash ist mit einem Wort aufgrund dieser "Funktion" sehr, sehr unsicher. svn und die
rsync
Verwendung mit Bash-Skripten sind besonders problematisch, da sie standardmäßig die Ergebnisse "zusammenführen" ... an Ort und Stelle bearbeiten.rsync
hat einen Modus, der dies behebt. svn und git nicht.Ich präsentiere eine Lösung. Erstellen Sie eine Datei mit dem Namen
/bin/bashx
:Verwenden
#!/bin/bashx
Sie jetzt Ihre Skripte und führen Sie sie immer mitbashx
statt ausbash
. Dies behebt das Problem - Sie könnenrsync
Ihre Skripte sicher speichern.Alternative (Inline-) Lösung, vorgeschlagen / getestet von @ AF7:
Geschweifte Klammern schützen vor Änderungen und Exit schützt vor Anhängen. Natürlich wären wir alle viel besser dran, wenn bash mit einer Option wie
-w
(ganze Datei) oder etwas, das dies tat, kommen würde.quelle
Teilen Sie Ihr Skript in Funktionen auf, und jedes Mal, wenn eine Funktion aufgerufen wird, wird
source
es aus einer separaten Datei aufgerufen . Dann können Sie die Dateien jederzeit bearbeiten und Ihr laufendes Skript übernimmt die Änderungen, wenn es das nächste Mal bezogen wird.quelle
Gute Frage! Hoffe, dieses einfache Skript hilft
Es scheint unter Linux, dass Änderungen, die an einer ausführenden .sh vorgenommen werden, vom ausführenden Skript vorgenommen werden, wenn Sie schnell genug tippen können!
quelle
Eine interessante Randnotiz: Wenn Sie ein Python-Skript ausführen, ändert sich dies nicht. (Dies ist wahrscheinlich für jeden offensichtlich, der versteht, wie Shell Python-Skripte ausführt, aber dachte, es könnte eine nützliche Erinnerung für jemanden sein, der nach dieser Funktionalität sucht.)
Ich erschuf:
Bearbeiten Sie dann in einer anderen Shell, während diese im Ruhezustand ist, die letzte Zeile. Wenn dies abgeschlossen ist, wird die unveränderte Zeile angezeigt, vermutlich weil ein
.pyc
? Gleiches passiert unter Ubuntu und macOS.quelle
Ich habe csh nicht installiert, aber
Führen Sie das aus und bearbeiten Sie schnell die letzte zu lesende Zeile
Ausgabe ist
Hrmph.
Ich denke, Änderungen an den Shell-Skripten werden erst wirksam, wenn sie erneut ausgeführt werden.
quelle
Change didn'ned
.Wenn dies alles in einem einzigen Skript enthalten ist, funktioniert es nicht. Wenn Sie es jedoch als Treiberskript einrichten, das Unterskripte aufruft, können Sie möglicherweise ein Unterskript ändern, bevor es aufgerufen wird, oder bevor es erneut aufgerufen wird, wenn Sie eine Schleife ausführen. In diesem Fall glaube ich, dass sich diese Änderungen ändern würde sich in der Ausführung widerspiegeln.
quelle
Ich höre nein ... aber was ist mit einer Indirektion:
BatchRunner.sh
Command1.sh
Command2.sh
Dann sollten Sie in der Lage sein, den Inhalt jeder Befehlsdatei zu bearbeiten, bevor BatchRunner dazu kommt, oder?
ODER
Bei einer saubereren Version würde BatchRunner auf eine einzelne Datei schauen, in der jeweils eine Zeile nach der anderen ausgeführt wird. Dann sollten Sie in der Lage sein, diese zweite Datei zu bearbeiten, während die erste richtig läuft?
quelle
Verwenden Sie stattdessen Zsh für Ihre Skripterstellung.
AFAICT, Zsh zeigt dieses frustrierende Verhalten nicht.
quelle
Normalerweise ist es ungewöhnlich, dass Sie Ihr Skript während der Ausführung bearbeiten. Alles, was Sie tun müssen, ist, die Kontrolle über Ihre Operationen zu überprüfen. Verwenden Sie if / else-Anweisungen, um nach Bedingungen zu suchen. Wenn etwas fehlschlägt, dann mach das, sonst mach das. Das ist der richtige Weg.
quelle