En un script, me meto en $0
la posible ruta relativa a él. Para convertirlo a absoluto, he encontrado esta solución que no entiendo:
abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
Mi problema es la magia dentro de ${0%/*}
y ${0##*/}
. Parece que el primero extrae el nombre del directorio y el segundo extrae el nombre del archivo, simplemente no entiendo cómo.
readlink -f $0
para obtener la ruta canónica.dirname
utilidad es útil aquí.BASH_SOURCE
que es mejor que$0
, como se$0
le da al usuario de tecleado en el mando, que podría no ser la secuencia de comandos se está ejecutando actualmente.Respuestas:
Definiciones:
${string%substring}
elimina la coincidencia más corta$substring
del final de$string
.${string##substring}
elimina la coincidencia más larga$substring
desde el comienzo de$string
.Su ejemplo:
${0%/*}
elimina todo después de la última barra oblicua y le da el nombre del directorio del script (que podría ser una ruta relativa).${0##*/}
elimina todo hasta la última barra oblicua, dándole solo el nombre de la secuencia de comandos.Entonces, este comando cambia al directorio del script y concatena el directorio de trabajo actual (dado por
$PWD
) y el nombre del script que le proporciona la ruta absoluta.Para ver lo que está pasando prueba:
fuente
Shawn tenía la solución más simple:
readlink -f $0
. Si desea estar absolutamente seguro de manejar nombres de archivos extraños, puede usar esto:Documentación
fuente
readlink -fn
es específico de Linux, NetBSD y OpenBSD.Aquí hay una forma más segura y legible de hacer este trabajo:
Notas:
$0
es un nombre de archivo simple sin ruta anterior, el script original fallará pero el que se proporciona aquí funcionará. (No es un problema$0
pero podría estar en otras aplicaciones).$0
, pero podría estar en otras aplicaciones).unset
es esencial si su usuario puede haberCDPATH
configurado.readlink -f
orealpath
, esto va a funcionar en las versiones no-Linux de Unix (por ejemplo, Mac OS X).fuente
Si desea aprender la expansión de parámetros de Shell, puede leerlo desde aquí , pero la expansión no siempre es una buena opción. En este caso, casi todos los sistemas tipo Unix tienen 2 buenas utilidades:
El primero extraerá el nombre del archivo, mientras que el segundo extraerá la ruta, por lo tanto, si tiene $ 0, diga:
Y obtendrás el camino.
Salud
fuente
Presentamos pwd, el bash incorporado. También se encuentra en el paquete GNU coreutils.
fuente