Ich schreibe also einen kleinen Paketmanager, und ein Problem, auf das ich gestoßen bin, besteht darin, symbolische Links zu Dateien zu erstellen.
Es installiert das Paket in /usr/pkg/name-version
und liest dann eine Datei, um zu bestimmen, welche symbolischen Links hergestellt werden sollen. Ich verwende ln
, um die Links zu erstellen, und beim Versuch, die Linux-API-Header zu installieren, ist ein Problem aufgetreten. Ich muss die Header-Dateien selbst verknüpfen, nicht die Ordner, die sie enthalten (wenn also 2 Pakete Dateien im selben Unterverzeichnis von include ablegen müssen, können sie dies, ohne ein Paket zu vermasseln).
Dieses Problem habe ich gelöst, aber ln
einfach Fehler gemacht, wenn der Pfad unvollständig ist, was ärgerlich ist, da diese Verzeichnisse erst existieren sollten, wenn das Paket installiert ist.
Gibt es ein Flag dafür ln
, das fehlende Verzeichnisse erstellt, oder muss ich ein verschlungenes Bash-Skript verwenden?
quelle
mkdir
... um Verzeichnisse zu erstellen ?lndir
.Antworten:
Sie benötigen kein kompliziertes Bash-Skript, sondern einen einfachen Einzeiler.
mkdir --parents
kümmert sich um alles, schön nicht einmal einen Fehler zu drucken, wenn die Verzeichnisstruktur bereits existiert.Seien Sie nur vorsichtig, wie Sie diese Verzeichnisse beim Entfernen behandeln, damit Sie andere Pakete nicht beschädigen.
Da Sie es einschreiben
bash
, können Sie sich auch die Zauberei (schamloser Stecker) ansehen . Vielleicht wäre es einfacher, das zu ändern, da es ausgereift und flexibel ist.quelle
system()
ist nicht einfacher, es ist sehr schwer, Befehlszeilenargumente richtig zu umgehensystem()
. Zumindest sollten Sieposix_spawn()
oder verwendenfork()+exec*()
, das Befehlszeilenargumente als Arrays akzeptiert.Es gibt keine Flagge, mit der man das machen könnte
ln
. Das Erstellen von Verzeichnissen ist nicht seine Aufgabe.mkdir -p foo/bar/qux
wird erstellenfoo
,foo/bar
undfoo/bar/qux
nach Bedarf. Rufen Sie also zuerstmkdir -p
alle bis auf die letzte Pfadkomponente auf.Es hört sich so an, als würden Sie
das RadStow neu erfinden , einen einfachen Paketmanager, der Verzeichnishierarchien zusammenführt, indem er Verzeichnisse in der erforderlichen Tiefe mit symbolischen Links zu Komponenten verschiedener Pakete erstellt. Oder vielleicht XStow , das wie Stow ist, aber mehr Anpassungsmöglichkeiten bietet .quelle
Vielleicht
tar
könnte helfen, die Datei mit den Links vorzubereiten:Und dann, um die Links zu erstellen, wo es nötig ist:
quelle