readlink -f
sarebbe la migliore se era portatile, perché risolve ogni collegamento trovato per entrambe le directory e file.
Su mac os x non c'è readlink -f
(eccetto forse tramite macports), quindi è possibile utilizzare solo readlink
per ottenere la destinazione di un file di collegamento simbolico specifico.
La tecnica $(cd -P ... pwd -P)
è bello, ma funziona solo per risolvere i collegamenti per le directory che portano allo script, non funziona se lo script è di per sé un link simbolico
Inoltre, un caso che non è stato menzionato: quando si lanciare uno script passandolo come argomento a una shell (/bin/sh /path/to/myscript.sh
), $0
non è utilizzabile in questo caso
Ho dato un'occhiata a mysql "binari", molti di loro sono in realtà script di shell; e ora capisco perché chiedono un'opzione --basedir
o devono essere lanciati da una specifica directory di lavoro; questo è perché non v'è alcuna buona soluzione per individuare lo script mirato
Ottima risposta: speravo che funzionasse anche se si crea lo script ". /some/script.sh 'ma non è così. – synthesizerpatel
@synthesizerpatel: in ksh93, hai '$ {. Sh.file}' che funziona anche per i file di origine. –
Come sottolineato da Gruik, questo non funziona se esiste un collegamento simbolico allo script della shell stesso. Quindi, se colleghi il comando in, dire,/usr/bin, allora __REAL_SCRIPTDIR restituirà/usr/bin, che è (molto probabilmente) non quello che vuoi. A quanto pare hai bisogno di un readlink per questo –