El problema
La respuesta actualmente aceptada solo funciona en condiciones importantes. Dado...
/foo/bar/first.sh:
function func1 {
echo "Hello $1"
}
y
/foo/bar/second.sh:
#!/bin/bash
source ./first.sh
func1 World
esto solo funciona si first.shse ejecuta desde el mismo directorio donde first.shse encuentra. Es decir. si la ruta de trabajo actual del shell es /foo, el intento de ejecutar el comando
cd /foo
./bar/second.sh
imprime error:
/foo/bar/second.sh: line 4: func1: command not found
Eso es porque source ./first.shes relativo a la ruta de trabajo actual, no a la ruta del script. Por lo tanto, una solución podría ser utilizar subshell y ejecutar
(cd /foo/bar; ./second.sh)
Solución más genérica
Dado...
/foo/bar/first.sh:
function func1 {
echo "Hello $1"
}
y
/foo/bar/second.sh:
#!/bin/bash
source $(dirname "$0")/first.sh
func1 World
entonces
cd /foo
./bar/second.sh
huellas dactilares
Hello World
Cómo funciona
$0 devuelve la ruta relativa o absoluta al script ejecutado
dirname devuelve la ruta relativa al directorio, donde existe el script $ 0
$( dirname "$0" )el dirname "$0"comando devuelve la ruta relativa al directorio del script ejecutado, que luego se usa como argumento para el sourcecomando
- en "second.sh",
/first.sh simplemente agrega el nombre del script de shell importado
source carga el contenido del archivo especificado en el shell actual