Cómo incluir un archivo en un script de shell bash

121

¿Hay alguna forma de incluir otro script de shell en un script de shell para poder acceder a sus funciones?

Al igual que en PHP, puede usar la includedirectiva con otros archivos PHP para ejecutar las funciones que están contenidas simplemente llamando al nombre de la función.

Mechaflash
fuente
@Troubadour gracias por la referencia. Aunque la publicación se refiere al sourcecomando, la pregunta en sí misma es cómo identificar la ubicación de un sourcearchivo.
Mechaflash
1
Las "preguntas básicas" son el catalizador del desbordamiento de la pila. Usted comprende que este sitio se indexa como cualquier otro sitio, y ahora "cómo incluir un archivo en un script de shell bash" aparecerá en el enlace de Google al desbordamiento de la pila, lo que aumentará el tráfico y la exposición del sitio. = D
Mechaflash
3
¡Eres inteligente! ¡Gracias tu genialidad!
Mechaflash
4
@Troubadour, es una tontería comentar que el usuario debería haber buscado en Google la respuesta, cuando así es exactamente como llegué a la página. Por ejemplo, hoy esta pregunta específica fue el principal resultado de Google para "bash include file". ¿Debería haberme saltado esta respuesta para encontrar otra solución?
lwitzel

Respuestas:

192

Simplemente ponga dentro de su secuencia de comandos:

source FILE

O

. FILE # POSIX compliant

$ LANG=C help source
source: source filename [arguments]
Execute commands from a file in the current shell.

Read and execute commands from FILENAME in the current shell.  The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.

Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
Gilles Quenot
fuente
17
Tenga en cuenta que . es compatible con POSIX mientras que la fuente no lo es
Mathieu_Du
Pero aquí la fuente no es exactamente la misma que incluimos en el Clenguaje. Aquí la fuente está ejecutando el script secundario en el script principal. ¿Qué pasa si solo quiero llamar a una función en particular desde el script secundario?
Paresh Mayani
8
No confunda . script.shcon ./script.sh. Perdí horas tratando de averiguar qué está pasando
Tihomir Mitkov
Mientras . es compatible con POSIX, lo que significa que funcionará en sh, dash, zsh y otros shells POSIX. Es mejor usar. ya que algunos shells tienen su propia versión similar, pero un poco diferente, de la "fuente" que puede dañar su aplicación.
Jacob Korba
51

Las respuestas anteriores son correctas, pero si ejecuta el script en otra carpeta, habrá algún problema.

Por ejemplo, a.shy b.shestán en la misma carpeta, a incluir b con . ./b.shpara incluir.

Cuando se ejecuta la escritura fuera de la carpeta, por ejemplo, con xx/xx/xx/a.sh, archivo b.shno encontrado: ./b.sh: No such file or directory.

yo suelo

. $(dirname "$0")/b.sh
Fancyoung
fuente
33

Sí, use la fuente o la forma corta que es simplemente .:

. other_script.sh
Pablo
fuente
3
Tenga en cuenta que la .versión funciona shtan bien como Bash. La "fuente" solo funciona en Bash.
Sridhar Sarnobat
2

En mi situación, para incluir color.shdesde el mismo directorio init.sh, tuve que hacer algo de la siguiente manera.

. ./color.sh

No estoy seguro de por qué ./y no color.shdirectamente. El contenido de color.shes el siguiente.

RED=`tput setaf 1`
GREEN=`tput setaf 2`
BLUE=`tput setaf 4`
BOLD=`tput bold`
RESET=`tput sgr0`

El uso de File color.shno produce error, pero el color no se muestra. He probado esto Ubuntu 18.04y la Bashversión es:

GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)

Raf
fuente
Eso solo le dará el archivo en su directorio de trabajo actual, no el directorio donde init.shestá (coinciden si lo lanzó ./init.shen primer lugar).
ricab