readlink -f
sería el mejor si era portátil, ya que resuelve cada enlaces que se encuentran a ambos directorios y archivos.
En mac os x no hay readlink -f
(excepto tal vez a través de macports), por lo que solo puede usar readlink
para obtener el destino de un archivo de enlace simbólico específico.
La técnica $(cd -P ... pwd -P)
es agradable, pero sólo funciona para resolver enlaces para directorios que conducen a la secuencia de comandos, no funciona si el guión en sí es un enlace simbólico
Además, un caso que no fue mencionado: cuando iniciar un script pasándolo como un argumento a un shell (/bin/sh /path/to/myscript.sh
), $0
no es utilizable en este caso
Eché un vistazo a los "binarios" de mysql, muchos de ellos son realmente scripts de shell; y ahora entiendo por qué piden una opción --basedir
o necesitan iniciarse desde un directorio de trabajo específico; esto se debe a que no hay una buena solución para localizar el guión dirigido
Excelente respuesta: esperaba que esto también funcionara si obtenías el script, es decir '. /some/script.sh 'pero no es así. – synthesizerpatel
@synthesizerpatel: en ksh93, tiene '$ {. Sh.file}' que también funciona para archivos de origen. –
Como lo señala Gruik, esto no funciona si hay un enlace simbólico al script de shell en sí. Entonces, si vincula el comando a, digamos,/usr/bin, entonces __REAL_SCRIPTDIR devolverá/usr/bin, que (lo más probable) no es lo que quiere. Aparentemente necesita un readlink para este –