Login
Login-Name Passwort


 
Newsletter
So, 31. Dezember 2000, 18:12

Patchen mit Komfort

Hat man sich den neuesten Patch für den Kernel oder für sonst ein Programm besorgt, heißt es, ihn mit einem Kommando wie "gzip -cd patch-2.4.0-test12.bz2 patch -p1 -s -E" einzuspielen.

Das sind ziemlich viele Tasten zu drücken. Doch Linux und UNIX sind dafür da, sich das Leben leichter zu machen, also warum erstellen wir nicht ein kleines Skript dafür und bauen gleich noch ein paar Rafinessen ein? Hier das Resultat:

#!/bin/sh

patch="patch -p1 -s -E"

case "$1" in
  *.gz)
    zcat "$1" $patch $2
  ;;
  *.bz2)
    bzip2 -cd "$1" $patch $2
  ;;
  *)
    cat "$1" $patch $2
  ;;
esac

Das Skript erkennt automatisch, ob der Patch mit gzip oder bzip2 komprimiert ist, und wirft den richtigen Entpacker an. Ist die Endung weder .gz noch .bz2, nimmt das Skript an, daß der Patch unkomprimiert ist. Statt der Endung könnte man auch das Programm »file« verwenden, dessen Ergebnis zuverlässiger ist.

Das Skript speichert man unter einem einprägsamen Namen in /usr/local/bin und setzt das x-Attribut.

Um das Skript zu verwenden, wechselt man in das Verzeichnis des Programms, das gepatcht werden soll. Beim Kernel könnte das beispielsweise /usr/src/linux oder /usr/src/linux-2.4.0 sein. Daher habe ich auch die Option -p1 für Patch gewählt, das die erste Komponente des Namens der zu patchenden Dateien wegläßt, denn das ist in den meisten Fällen ein willkürlich gewählter Verzeichnisname. Der Aufruf ist

kernel-patch patchdatei optionen

(bei mir heißt das Skript kernel-patch, obwohl es mit allen Programmen funktionieren müßte, die Patches anbieten). Optionen sind hier für das Programm patch gedacht. Man kann sie im Normalfall einfach weglassen. In der Tat habe ich sie noch nie benötigt.

Besonders beim Kernel ist es öfter mal nötig, einen Patch wieder rückgängig zu machen. Auch dafür habe ich ein Skript:

#!/bin/sh

patch="patch -p1 -s -R"

case "$1" in
  *.gz)
    zcat "$1" $patch $2
  ;;
  *.bz2)
    bzip2 -cd "$1" $patch $2
  ;;
  *)
    cat "$1" $patch $2
  ;;
esac

Der Unterschied zum ersten Skript ist exakt ein Zeichen.

Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten