script programas programa hacer ejemplos ejecutar desde como comando bash path filepath

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 ejecuta script.sh

Los dos scripts deben estar en el mismo directorio. Necesito el primer script para llamar al segundo, pero hay dos problemas:

  1. 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 )
  2. El script script.sh cambiará a un directorio diferente antes de llamar a helper.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

  1. 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.

  1. El script script.sh cambiará a un directorio diferente antes de llamar a helper.sh .

Nuevamente, ya que tiene la ruta en $0 puede volver a ella.