Tengo una utilidad que consta de un par de directorios con algunos scripts de bash y archivos de soporte que se implementarán en varias máquinas, posiblemente en un directorio diferente en cada máquina. Los scripts deben poder hacer referencia a las rutas relativas a ellos mismos, por lo que necesito poder obtener la ruta al archivo que se está ejecutando actualmente.
Soy consciente del dirname $0idioma que funciona perfectamente cuando mi script se llama directamente. Desafortunadamente, existe el deseo de poder crear enlaces simbólicos a estos scripts desde un directorio totalmente diferente y todavía tener la lógica de ruta relativa de trabajo.
Un ejemplo de la estructura general general es el siguiente:
/
|-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)
¿Cómo puedo hacer referencia confiable /usr/local/lib/foo/res/resource_file.txtde script.shsi es invocado por /usr/local/lib/foo/bin/script.sho ~mike/bin/link_to_script?
fuente

sourced (p$ source ./sript.sh. Ej. ) Esto funciona para ambos casos:DIR="$(cd "$(dirname "$BASH_SOURCE")" && pwd)"una línea:
fuente
readlink -fno funciona para mí, tengo este error:Pero esto funciona bien:
fuente
Una pequeña adición al script anterior. La opción -P para pwd sigue enlaces simbólicos
fuente