PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Binärdatei an Muster ('###') in zwei Teile schneiden, mit Bash, Perl etc.



axeljaeger
14-09-2003, 19:06
Ich möchte ein selbsextrahierendes Setupprogramm schreiben. Dazu hab ich mir gedacht, hänge ich vorne mit cat an ein tar.bz2-Archiv einen kleinen Shellskriptvorspann an, der sich selbst entfernen soll, das was übrig bleibt in /tmp/irgendwas.tar.bz2 kopiert, das Archiv entpackt und eine Datei im Archiv ausführt. Das Ende meines Shellskriptes wollte ich mit drei Rauten markieren. Das Skript müsste also nur die gesammte Datei öffnen und alles, was hinter den drei Rauten steht in eine Datei kopieren. Mein Problem ist, ich weis nicht, wo ich ansetzen soll. Ich hab hier in einem Buch etwas gefunden, das nennt sich "Parametersubstitution". Damit sollte ich es doch eigetnlich schaffen können, alles vor "###" zu eliminieren. Das klappt aber bei nicht. Hier ist der Quelltext, den ich bisher habe:



#!/bin/bash
cat ${cat installer.sh#*'###'} > installer.exe
exit
###


Da bekomme ich immer eine
installer.sh: line 2: ${installer.sh#*'###'}: bad substitution

Ich weis jetzt nicht, ob das mit der Parametersubstitution der richtige Ansatz ist, bessere Lösungen sind willkommen. Ich hab mir auch schon überlegt, vielleicht noch Perl mit einzuspannen, dabei ergibt sich allerdings das Problem, das ich das Perl-Skript in mein Shellskript einbinden müsste, weil ich an ein Perlskript nicht ohne weiteres eine Binärdatei anhängen kann, ohne das der Interpreter meckert.


Beim Denken, wie das denn gehen könnte, ist mir noch ein Problem eingefallen: Wenn das Skript nicht mit dem Verzeichnis, in dem Skript liegt, als Workingdir aufgerufen wird, wird die Datei wahrscheinlich gar nicht gefunden. Gibt es da noch eine Idee, wie man den absoluten Pfad vom aktuellen Skript herausbekommen kann?


Vielen Dank im Vorraus.

axeljaeger
15-09-2003, 15:55
Hm, ich bin jetzt soweit, das ich mir überlege, meine ganze Datei in ein Array einzulesen, und dann mit einer For-Schleife solange alle Zeilen zu ignorieren, bis ich mein Muster gefunden habe, und ab dann hänge ich jede Zeile an eine Temp-Datei an. Jetzt frage ich mir nur, ob das elegant ist, mit einer Schleife erst nach dem Muster zu suchen, oder ob es eher in der Shell eine Funktio indexof gibt. Kann ich außerdem den kompletten Bereich nach dem Muster in eine Daeti kopieren, oder muss ich wirklich jede Zeile einzeln an die Datei hängen? Ist ein bißchen blöd gefragt alles, aber mir fehlt der rechte Ansatz, um das einigermaßen elegant zu lösen.

axeljaeger
15-09-2003, 17:41
So, ich hab jetzt ein Skript, was auch richtig zu funktionieren scheint, nur ist die Binärdatei nicht 1 zu 1 das, was ich dran gehängt habe. Aus einer 2.8 kb-Exe wurde ein 1.5 kb Krüppel, der sich leider dann auch nicht starten ließ.



#!/bin/bash
content=$(cat $0)
pattern=*~
pattern=$pattern~
echo ${content#$pattern}
exit
~~

Das Pattern musste ich aus zwei Teilen zusammensetzen, weil sonst schon in der Substitution die Trennung erfolgt worden wäre.

Thomas Engelke
01-10-2003, 14:31
Hallo Axel!

Also ich bin ja auch relativ neu, aber das würde ich mittels einer Scriptsprache angehen (in meinem Falle Perl).

Mittels Perl kann man sich selbst ja herausfinden (also seinen eigenen Namen). Davon liest man dann binär soviele Zeichen, wie groß man ist, und schreibt diese in eine Variable.
In dieser läßt sich über reguläre Ausdrück relativ einfach ersetzun und in eine neue Datei schreiben, welche man im temporären Umgebungsvariablen-Verzeichnis ablegt.

AD!

axeljaeger
01-10-2003, 16:57
Das Problem hat sich erledigt: Ich hab einfach Tail genommen und die ersten 10 Zeilen überlesen. Perl hat sich nicht geeignet, weil da anscheinend das Skript am Anfang komplett geparst wird, so das man nicht ohne weiteres Binärdateien anhängen kann. Mit Shell geht das, einfach vor den Binärdaten exit sagen.