2013-11-25 23 views
5

Sto lavorando a uno script di disinstallazione per eliminare la cartella principale in cui è installato lo script.Recupera directory principale di script

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

Così uninstall.sh ha a che fare questo:

rm- rf /usr/local/Myapplication 

posso recuperare la cartella in cui risiede disinstallazione

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

Ma io sono ancora sicuri del grazioso modo per ottenere il percorso genitore. Ho pensato di usare sed per smontare la parte "Uninstaller" di questo percorso, ma esiste un modo elegante per ottenere il percorso della cartella Myapplication per eliminarlo?

Grazie

+0

nello script: 'cd "$ (dirname "$ 0")" && cd .. && cd .. && [-d Mya pplication/Uninstaller] && rm -rf Myapplication' (Ho aggiunto un controllo che la directory che stiamo per eliminare contiene una sottodir "Uninstaller", ma potresti forse aggiungere un controllo migliore, ad esempio di un file necessario in MyApplication?). Se non conosci MyApplication, allora: 'cd" $ (dirname $ 0) "&& cd .. && zepath =" $ (pwd) "&& cd .. && [-f" $ {zepath}/somefilesthathouldbehere "] && rm -rf "$ {zepath}" ' –

+0

Vedere il famoso [uno script Bash può indicare in quale directory è memorizzato?] (http://stackoverflow.com/questions/59895/can-a-bash-script-tell- what-directory-its-stored-in) domanda, quindi 'cd ..' da lì. –

risposta

9

Che ne dici di utilizzare dirname due volte?

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

Il citato desaster è necessario solo per evitare spazi bianchi nei percorsi. In caso contrario, sarebbe più piacevole per gli occhi:

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

Funziona ma sono abbastanza incerto se uso dirname due volte per ottenere ciò che voglio. Altro a scopo di apprendimento c'è un modo per farlo in una sola riga di comando? sicuramente 'APP_ROOT = $ (nome_directory" '' $ (readlink -f "$ 0") '' ")' funzionerebbe ma esiste un altro modo? –

+0

Non è necessario essere incerti su questo. 'dirname' è adattato per darti la parte della directory di un percorso. È esattamente lo strumento giusto per farlo. Aggiorno la risposta per la sintassi. – Boldewyn

+0

Nota: questo metodo non è sicuro per i nomi "brutti". Un nome come "-rm -rf" interromperà il comportamento desiderato. Probabilmente "." lo sarà anche Non so se sia il modo migliore, ma ho creato una domanda separata "corretta per la precisione" qui: http://stackoverflow.com/questions/40700119/get-parent-directory-for-a-file- in-bash – VasyaNovikov

0

Perché non è sufficiente aggiungere ../ alla fine del percorso?

+0

Questo non funzionerebbe con rm, UNINSTALL_PATH = $ (dirname "$ SYMLINKS") /../ non è il percorso padre corretto quando usato con il comando rm –

+2

Inoltre, dovresti aggiungere '/../'. E se, per qualsiasi motivo, '$ UNINSTALL_PATH' è vuoto,' /../ ==/'e stai pulendo il disco rigido. – Boldewyn

4

solo ottenere il padre della directory genitore:

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

Se avete bisogno di un percorso assoluto, allora avete bisogno cd. In caso contrario, si può semplicemente utilizzare $(dirname $0)/..

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

il modo semplice finale di ottenere il percorso della directory genitore:

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

Questa è la directory principale della directory corrente, non dove risiede lo script. Per utilizzarlo dovrei prima fare un CD nella directory degli script, quindi non è troppo elegante. –

2

percorso completo a dir genitore dello script, vale a dire "/ usr/local/bin/bla" : export PARENT_OF_THIS_SCRIPT=$(cd $(dirname $0) ; pwd -P)

solo il più recente genitore dello script, vale a dire "bla": export PARENT_DIR_OF_SCRIPT=$(cd $(dirname $0) ; pwd -P | xargs basename)

Problemi correlati