UPDATE: dies ist eine Neuveröffentlichung von Wie man Shell-Skripte so gestaltet, dass sie während ihrer Ausführung keine Änderungen am Quelltext erfahren
Das ist eine Kleinigkeit, die mich hin und wieder stört:
- Ich schreibe ein Shell-Skript (bash) für eine schnelle und schmutzige Arbeit
- Ich führe das Skript aus, und es läuft eine ganze Weile lang
- Während es läuft, bearbeite ich ein paar Zeilen im Skript und konfiguriere es für einen anderen Auftrag
- Aber der erste Prozess liest immer noch dieselbe Skriptdatei und gerät völlig durcheinander.
Offenbar wird das Skript interpretiert, indem jede Zeile aus der Datei wie es erforderlich ist . Gibt es eine Möglichkeit, der Shell mitzuteilen, dass die gesamte Skriptdatei auf einmal in den Speicher eingelesen werden soll? Perl-Skripte scheinen dies zum Beispiel zu tun: Die Bearbeitung der Codedatei wirkt sich nicht auf einen Prozess aus, der sie gerade interpretiert (weil sie zunächst geparst/kompiliert wird?).
Mir ist klar, dass es viele Möglichkeiten gibt, dieses Problem zu umgehen. Ich könnte zum Beispiel etwas wie folgt versuchen:
cat script.sh | sh
o
sh -c "`cat script.sh`"
... obwohl diese möglicherweise nicht korrekt funktionieren, wenn die Skriptdatei groß ist und es Grenzen für die Größe von Stream-Puffern und Befehlszeilenargumenten gibt. Ich könnte auch einen Hilfs-Wrapper schreiben, der eine Skriptdatei in eine gesperrte temporäre Datei kopiert und sie dann ausführt, aber das scheint nicht sehr portabel zu sein.
Ich hoffte also auf die einfachste Lösung, bei der nur das Skript geändert wird, nicht aber die Art und Weise, in der es aufgerufen wird. Kann ich einfach eine oder zwei Zeilen am Anfang des Skripts hinzufügen? Ich weiß nicht, ob eine solche Lösung existiert, aber ich vermute, sie könnte die Variable $0 verwenden...