it-swarm.it

Ottieni il percorso dello script corrente quando eseguito tramite un collegamento simbolico

Ho un'utilità composta da un paio di directory con alcuni script bash e file di supporto che verranno distribuiti su più macchine, possibilmente in una directory diversa su ogni macchina. Gli script devono poter fare riferimento ai percorsi relativi a se stessi, quindi devo essere in grado di ottenere il percorso del file attualmente in esecuzione.

Sono a conoscenza del dirname $0 linguaggio che funziona perfettamente quando il mio script viene chiamato direttamente. Sfortunatamente c'è il desiderio di essere in grado di creare collegamenti simbolici a questi script da una directory totalmente diversa e avere ancora il relativo lavoro di logica di tracciamento.

Un esempio della struttura generale del dripping è il seguente:

/
 |-usr/local/lib
 |  |-foo
 |  |  |-bin
 |  |  |  |-script.sh
 |  |  |-res
 |  |  |  |-resource_file.txt
 |-home/mike/bin
 |  |-link_to_script (symlink to /usr/local/lib/foo/bin/script.sh)

Come posso fare riferimento in modo affidabile /usr/local/lib/foo/res/resource_file.txt a partire dal script.sh se viene invocato da /usr/local/lib/foo/bin/script.sh o ~mike/bin/link_to_script?

59
Mike Deck

Prova questo come soluzione per scopi generici:

DIR="$(cd "$(dirname "$0")" && pwd)"

Nel caso specifico dei seguenti collegamenti simbolici, è possibile eseguire questa operazione:

DIR="$(dirname "$(readlink -f "$0")")"
83
Caleb

una linea:

cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))
8
diyism

readlink -f non funziona per me, ho questo errore:

readlink: illegal option -- f
usage: readlink [-n] [file ...]

Ma funziona benissimo:

DIR="$(dirname "$(readlink "$0")")"
echo $DIR
4
Kevin Campion

Una piccola aggiunta allo script sopra. L'opzione -P per pwd segue i symlink

DIR="$(cd "$(dirname "$0")" && pwd -P)"
0
user2108420