programas - script en bash
Ejecuta un script en el mismo directorio que el script actual (2)
$ 0 es considerado unsafe por muchos desarrolladores. He encontrado otra solución, es segura para una cadena de scripts y fuentes de bash.
Si a.sh necesita ejecutar b.sh (que se ubica en la misma carpeta) utilizando el proceso bash secundario :
#!/bin/bash
__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
bash ${__dir}/b.sh
Si a.sh necesita ejecutar b.sh (que se ubica en la misma carpeta) utilizando el mismo proceso de bash:
#!/bin/bash
__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source ${__dir}/b.sh
Tengo dos scripts Bash en la misma carpeta (guardados en algún lugar por el usuario que descarga todo el repositorio):
-
script.sh
es ejecutado por el usuario - Se requiere
helper.sh
y lo ejecutascript.sh
Los dos scripts deben estar en el mismo directorio. Necesito el primer script para llamar al segundo, pero hay dos problemas:
- Saber el directorio de trabajo actual es inútil para mí, porque no sé cómo el usuario está ejecutando el primer script (podría estar con
/usr/bin/script.sh
, con./script.sh
, o podría estar con../Downloads/repo/scr/script.sh
) - El script
script.sh
cambiará a un directorio diferente antes de llamar ahelper.sh
.
Definitivamente puedo hackear Bash que hace esto almacenando el directorio actual en una variable, pero ese código parece innecesariamente complicado, por lo que imagino que es una tarea muy común y simple.
¿Existe una forma estándar de llamar de forma confiable a helper.sh
desde script.sh
? ¿Y funcionará en cualquier sistema operativo compatible con Bash?
Ya que $0
contiene la ruta completa del script que se está ejecutando, puedes usar dirname
para obtener la ruta del script:
#!/bin/bash
script_name=$0
script_full_path=$(dirname "$0")
echo "script_name: $script_name"
echo "full path: $script_full_path"
así que si, por ejemplo, lo almacena en /tmp/a.sh
, verá una salida como:
$ /tmp/a.sh
script_name: /tmp/a.sh
full path: /tmp
asi que
- Saber el directorio de trabajo actual es inútil para mí, porque no sé cómo el usuario está ejecutando el primer script (podría estar con
/usr/bin/script.sh
, con./script.sh
, o podría estar con../Downloads/repo/scr/script.sh
)
El uso de dirname "$0"
le permitirá realizar un seguimiento de la ruta original.
- El script
script.sh
cambiará a un directorio diferente antes de llamar ahelper.sh
.
Nuevamente, ya que tiene la ruta en $0
puede volver a ella.