Kann ein Shell-Skript anzeigen, dass die Zeilen zuerst in den Speicher geladen werden?

8

UPDATE: Dies ist ein erneuter Aufruf von Wie man Shell-Skripte so robust macht, dass die Quelle während der Ausführung geändert wird

Das ist eine kleine Sache, die mich ab und an stört:

  1. Ich schreibe ein Shell-Skript (bash) für einen schnellen und schmutzigen Job
  2. Ich führe das Skript aus und es läuft eine ganze Weile
  3. Während es läuft, bearbeite ich ein paar Zeilen im Skript und konfiguriere es für einen anderen Job
  4. Aber der erste Prozess liest immer noch die gleiche Skriptdatei und alles wird vermasselt.

Offensichtlich wird das Skript interpretiert, indem jede Zeile aus der Datei geladen wird, wie sie benötigt wird . Gibt es eine Möglichkeit, dass das Skript der Shell anzeigen kann, dass die gesamte Skriptdatei gleichzeitig in den Speicher gelesen werden soll? Zum Beispiel scheinen Perl-Skripte dies zu tun: Die Bearbeitung der Code-Datei hat keinen Einfluss auf einen Prozess, der sie gerade interpretiert (weil sie zuerst geparst / kompiliert wird?).

Ich verstehe, dass es viele Möglichkeiten gibt, dieses Problem zu umgehen. Zum Beispiel könnte ich etwas versuchen wie:

%Vor%

oder

%Vor%

... obwohl diese möglicherweise nicht korrekt funktionieren, wenn die Skriptdatei groß ist und die Größe von Stream-Puffern und Befehlszeilenargumenten begrenzt ist. Ich könnte auch einen Hilfswrapper schreiben, der eine Skriptdatei in eine gesperrte temporäre Datei kopiert und dann ausführt, aber das scheint nicht sehr portabel zu sein.

Ich habe also auf die einfachste Lösung gehofft, die nur das Skript verändert, nicht die Art und Weise, wie es aufgerufen wird. Kann ich am Anfang des Skripts nur ein paar Zeilen hinzufügen? Ich weiß nicht, ob es eine solche Lösung gibt, aber ich vermute, es könnte die Variable $ 0 verwenden ...

    
Anonymous 25.02.2010, 19:32
quelle

6 Antworten

7

Die beste Antwort, die ich gefunden habe, ist eine sehr geringfügige Variation der angebotenen Lösungen. Wie man Shell-Skripte so robust macht, dass sie so geändert werden wie sie sind renne . Danke an camh, dass du den Repost notiert hast!

%Vor%

Dies stellt sicher, dass der gesamte Code zuerst analysiert wird. Beachten Sie, dass der 'Exit' entscheidend ist, um sicherzustellen, dass später nicht auf die Datei zugegriffen wird, um festzustellen, ob weitere Zeilen zu interpretieren sind. Wie bereits im vorherigen Beitrag erwähnt, ist dies keine Garantie dafür, dass andere von Ihrem Skript aufgerufene Skripts sicher sind.

Danke für die Hilfe!

    
Anonymous 01.03.2010, 19:32
quelle
2

Wie wäre es mit einer Lösung, wie Sie es bearbeiten?

Wenn das Skript ausgeführt wird, tun Sie Folgendes, bevor Sie es bearbeiten:

%Vor%

Da die Shell die Datei offen hält, solange Sie den Inhalt des offenen Inode nicht ändern, funktioniert alles in Ordnung.

Das obige funktioniert, weil mv den alten inode erhält, während cp einen neuen erzeugt. Da der Inhalt einer Datei nicht wirklich entfernt wird, wenn sie geöffnet wird, können Sie sie sofort entfernen und sie wird bereinigt, sobald die Shell die Datei schließt.

    
R Samuel Klatchko 25.02.2010 19:43
quelle
2

Verwenden Sie einen Editor, der die vorhandene Datei nicht ändert und stattdessen eine neue Datei erstellt und die alte Datei ersetzt. Verwenden Sie beispielsweise :set writebackup backupcopy=no in Vim.

    
ephemient 25.02.2010 19:58
quelle
1

Laut bash Dokumentation statt

%Vor%

Sie versuchen

%Vor%

Dann denke ich, dass Sie im Geschäft sein werden.

    
Norman Ramsey 26.02.2010 01:23
quelle
0

Ziehen Sie in Erwägung, einen neuen Bang-Pfad für Ihre schnellen und schmutzigen Jobs zu erstellen. Wenn Sie Ihre Skripte starten mit: #!/usr/local/fastbash

oder etwas, dann können Sie einen Fastbash-Wrapper schreiben, der eine der 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.

    
swestrup 25.02.2010 20:31
quelle
0

Wenn Sie Emacs verwenden, versuchen Sie M-x customize-variable break-hardlink-on-save . Wenn Sie diese Variable setzen, wird Emacs angewiesen, in eine temporäre Datei zu schreiben und dann die temporäre Datei über das Original umzubenennen, anstatt die ursprüngliche Datei direkt zu bearbeiten. Dies sollte der laufenden Instanz ermöglichen, ihre unveränderte Version beizubehalten, während Sie die neue Version speichern.

Vermutlich hätten andere semi-intelligente Editoren ähnliche Optionen.

    
Ryan Thompson 26.02.2010 00:31
quelle

Tags und Links