Ich habe ein Bash-Skript, das seinen vollständigen Pfad kennen muss. Ich versuche, einen weitgehend kompatiblen Weg zu finden, um das zu tun, ohne mit relativen oder komisch aussehenden Pfaden zu enden. Ich brauche nur Bash zu unterstützen, nicht sh, csh, etc.
Was ich bis jetzt herausgefunden habe:
-
Die akzeptierte Antwort auf Abrufen des Quellverzeichnisses eines Bash-Skripts aus Adressen, die den Pfad des Skripts über
dirname $0
was in Ordnung ist, aber das kann zu einem relativ Pfad (wie.
), was ein Problem darstellt, wenn Sie Verzeichnisse im Skript ändern und der Pfad weiterhin auf das Skriptverzeichnis verweisen soll. Trotzdem,dirname
wird ein Teil des Puzzles sein. -
Die akzeptierte Antwort auf Absoluter Pfad eines Bash-Skripts unter OS X (OS X-spezifisch, aber die Antwort funktioniert trotzdem) gibt eine Funktion an, die prüft, ob
$0
relativ aussieht und, falls dies der Fall ist, vorangestellt wird$PWD
dazu. Aber das Ergebnis kann immer noch relative Bits enthalten (obwohl es insgesamt absolut ist) - zum Beispiel, wenn das Skriptt
im Verzeichnis/usr/bin
und Sie sind in/usr
und Sie geben einbin/../bin/t
um es auszuführen (ja, das ist verworren), landet man bei/usr/bin/../bin
als Verzeichnispfad für das Skript. Welche Werke ...aber... -
Le site
readlink
Lösung auf dieser Seite die wie folgt aussieht:# Absolute path to this script. /home/user/bin/foo.sh SCRIPT=$(readlink -f $0) # Absolute path this script is in. /home/user/bin SCRIPTPATH=`dirname $SCRIPT`
Aber
readlink
ist nicht POSIX und die Lösung beruht offenbar auf GNUsreadlink
wo BSDs aus irgendeinem Grund nicht funktionieren (ich habe keinen Zugang zu einem BSD-ähnlichen System, um das zu überprüfen).
Es gibt also verschiedene Möglichkeiten, die aber alle ihre Tücken haben.
Was wäre ein besserer Weg? Wobei "besser" bedeutet:
- Das gibt mir den absoluten Pfad.
- Entfernt störende Teile, selbst wenn sie auf komplizierte Weise aufgerufen werden (siehe Kommentar zu Nr. 2 oben). (Z.B. wird der Pfad zumindest mäßig kanonisiert.)
- Bezieht sich nur auf Bash-ismen oder Dinge, die mit ziemlicher Sicherheit in den meisten gängigen Varianten von *nix-Systemen (GNU/Linux, BSD und BSD-ähnlichen Systemen wie OS X usw.) enthalten sind.
- Vermeidet, wenn möglich, den Aufruf externer Programme (z.B. bevorzugt Bash built-ins).
- ( Aktualisiert danke für die Vorwarnung, welche ) Es muss keine Symlinks auflösen (mir wäre es sogar lieber, wenn es sie in Ruhe ließe, aber das ist keine Voraussetzung).