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.shes ejecutado por el usuario - Se requiere
helper.shy 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.shcambiará 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.shcambiará a un directorio diferente antes de llamar ahelper.sh.
Nuevamente, ya que tiene la ruta en $0 puede volver a ella.