2013-11-25 22 views
5

Ich arbeite an einem Deinstallationsskript, um den übergeordneten Ordner zu löschen, in dem das Skript installiert ist.Abrufen des übergeordneten Verzeichnisses des Skripts

/usr/local/Myapplication/Uninstaller/uninstall.sh 

So hat uninstall.sh dies zu tun:

rm- rf /usr/local/Myapplication 

ich den Ordner abrufen können, wo Deinstallation

SYMLINKS=$(readlink -f "$0") 
UNINSTALL_PATH=$(dirname "$SYMLINKS") 

wohnt Aber ich bin immer noch unsicher über die hübsche Weise zu erhalten der übergeordnete Pfad Ich dachte an sed, um den "Uninstaller" Teil dieses Pfades zu entfernen, aber gibt es eine elegante Möglichkeit, den Pfad zum Myapplication-Ordner zu bekommen, um ihn zu löschen?

Danke

+0

in Ihrem Skript: 'cd "$ (dirname "$ 0")" && cd .. && cd .. && [-d Meine Güte pplication/Uninstaller] && rm -rf Myapplication' (Ich fügte hinzu, dass das zu löschende Verzeichnis ein Unterverzeichnis "Uninstaller" enthält, aber Sie könnten vielleicht eine bessere Überprüfung hinzufügen, zum Beispiel eine notwendige Datei in Myapplication?). Wenn Sie Myapplication nicht kennen, dann: 'cd" $ (dirname $ 0) "&& cd .. && zepath =" $ (pwd) "&& cd .. && [-f" $ {zepath}/somefilesthat hier "] && rm -rf "$ {zepath}" ' –

+0

Sehen Sie das berühmte [Kann ein Bash-Skript sagen, in welchem ​​Verzeichnis es gespeichert ist?] (http://stackoverflow.com/questions/59895/can-a-bash-script-tell-) was-directory-its-stored-in) Frage, dann 'cd ..' von dort. –

Antwort

9

Wie wäre es mit dirname zweimal?

APP_ROOT="$(dirname "$(dirname "$(readlink -fm "$0")")")" 

Die Quotation Desaster ist nur notwendig, um Whitespace in Pfaden zu verhindern. Sonst wäre es angenehm für das Auge sein:

APP_ROOT=$(dirname $(dirname $(readlink -fm $0))) 
+0

Das funktioniert, aber ich bin ein wenig unzufrieden bei der Verwendung von dirname zweimal, um zu erreichen, was ich will. Mehr zum Lernen gibt es eine Möglichkeit, es in einer einzigen Befehlszeile zu bekommen? sure 'APP_ROOT = $ (dirname" '' $ (readlink -f "$ 0") '' ")" würde funktionieren, aber gibt es einen anderen Weg? –

+0

Sie müssen nicht zweifelhaft sein. 'dirname' ist auf den Teil des Verzeichnisses eines Pfades zugeschnitten. Es ist genau das richtige Werkzeug dafür. Ich aktualisiere die Antwort für die Syntax. – Boldewyn

+0

Hinweis: Diese Methode ist unsicher für "hässliche" Namen. Ein Name wie "-rm -rf" wird das gewünschte Verhalten brechen. Wahrscheinlich "." wird auch. Ich weiß nicht, ob das der beste Weg ist, aber ich habe hier eine separate "Korrektheit fokussierte" Frage erstellt: http://stackoverflow.com/questions/40700119/get-parent-directory-for-a-file- in-bash – VasyaNovikov

0

Warum gehe ich nicht einfach am Ende des Weges hinzufügen ../?

+0

Das würde nicht mit rm funktionieren, UNINSTALL_PATH = $ (dirname "$ SYMLINKS") /../ ist nicht der korrekte Vaterpfad, wenn er mit dem Befehl rm verwendet wird –

+2

Außerdem müssten Sie '/../' hinzufügen. Und wenn '$ UNINSTALL_PATH' aus irgendeinem Grund leer ist, '/../ == /' und Sie löschen die Festplatte. – Boldewyn

4

Nehmen Sie einfach die Eltern des übergeordneten Verzeichnisses:

my_app_path=$(dirname $(dirname $(readlink -f "$0"))) 
3

Wenn Sie einen absoluten Pfad benötigen, dann müssen Sie cd. Ansonsten können Sie nur $(dirname $0)/..

cd $(dirname $0)/.. 
path=$(pwd) 
cd - # go back 
4

die ultimative einfache Weg, um den Pfad übergeordnete Verzeichnis verwenden:

PARENT_DIRECTORY="${PWD%/*}" 
+2

Dies ist das übergeordnete Verzeichnis des aktuellen Verzeichnisses, in dem sich das Skript nicht befindet. Um dies zu verwenden, müsste ich zuerst eine CD in das Skriptverzeichnis schreiben, damit es nicht zu elegant ist. –

2

Vollständiger Pfad zum Elternverzeichnis von Skript, das heißt "/ usr/local/bin/bla" : export PARENT_OF_THIS_SCRIPT=$(cd $(dirname $0) ; pwd -P)

Gerade die jüngst Eltern von Skript, das heißt "bla": export PARENT_DIR_OF_SCRIPT=$(cd $(dirname $0) ; pwd -P | xargs basename)

Verwandte Themen