18 Stimmen

Kann ein Shell-Skript angeben, dass seine Zeilen zunächst in den Speicher geladen werden sollen?

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:

  1. Ich schreibe ein Shell-Skript (bash) für eine schnelle und schmutzige Arbeit
  2. Ich führe das Skript aus, und es läuft eine ganze Weile lang
  3. Während es läuft, bearbeite ich ein paar Zeilen im Skript und konfiguriere es für einen anderen Auftrag
  4. 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...

0voto

swestrup Punkte 4061

Überlegen Sie sich, ob Sie nicht einen neuen Weg für Ihre Schnellschüsse einschlagen wollen. Wenn Sie Ihre Skripte mit beginnen: #!/usr/local/fastbash

oder so, dann können Sie einen Fastbash-Wrapper schreiben, der eine der von Ihnen genannten Methoden verwendet. Für die Portabilität kann man einfach einen Symlink von fastbash zu bash erstellen oder einen Kommentar im Skript haben, der besagt, dass man fastbash durch bash ersetzen kann.

0voto

Ryan C. Thompson Punkte 38726

Wenn Sie Emacs verwenden, versuchen Sie M-x customize-variable break-hardlink-on-save . Das Setzen dieser Variable weist Emacs an, in eine temporäre Datei zu schreiben und dann die temporäre Datei über die Originaldatei umzubenennen, anstatt die Originaldatei direkt zu bearbeiten. Dies sollte es der laufenden Instanz erlauben, ihre unveränderte Version zu behalten, während Sie die neue Version speichern.

Vermutlich hätten andere halbintelligente Redakteure ähnliche Möglichkeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X