Tengo un script que tiene muchas funciones internas.
miarchivo1.sh:
func1() {}
func2() {}
Puedo llamarlos desde el script con:
miarchivo2.sh:
source myfile1.sh
func1
func2
Pero, ¿cómo puedo llamarlos si provienen de un script anidado?
miarchivo3.sh:
./myfile2.sh
func2
func2: command not found
¿Puedo "exportar" funciones myfile2
para que todos las conozcan?
No puedo usarlo export -f
porque hay muchas funciones.
Respuesta1
Tenga en cuenta que bash
no lo es sh
. export -f
es específico del bash
caparazón.
Si un script no tiene un she-bang, será interpretado por un shell tipo POSIX que puede no ser bash. Si tiene la intención de utilizar bash
funciones específicas en su secuencia de comandos, debe asegurarse de que tenga:
#! /path/to/bash -
she-bang o que lo invoques como bash path/to/the/script
. Además, dar .sh
extensiones a los guiones escritos en el bash
idioma es un poco engañoso.
Now bash
es uno de esos pocos shells que pueden exportar funciones al entorno (de hecho, utilizando variables de entorno especiales entendidas bash
únicamente por comandos). Se puede hacer usando el export -f
comando específico de bash. bash
También exporta todas las funciones que se declaran mientras la allexport
opción está activada.
Pero en cualquier caso, ninguno de los dos funcionaría en su caso. export
ing algo desde un shell, ya sea una variable o función, es para que esa variable/función esté disponible en otros shells que ese shellejecuta(exportar se trata de preservar las cosas en todoejecución).
Entonces, incluso si myfile1.sh
o myfile2.sh
exportaran las funciones que declararon (con export -f
o teniendo una set -o allexport
declaración de variable antes), eso solo afectaría los shells que ejecutaría el shell que interpreta esos scripts. Aquí myfile2.sh
no se está ejecutando myfile3.sh
, es al revés.
Aquí necesitarías que tu myfile3.sh
script hiciera:
source path/to/myfile2.sh
de modo que sea el mismo shell el que interprete el código en todos los myfile1.sh
scripts myfile2.sh
y myfile3.sh
, y entonces no sería necesario exportar ninguna función.
Tenga en cuenta que en los sistemas donde sh
está bash
, probablemente no sea una buena idea exportar funciones, ya que eso afecta a todos los scripts sh y bash y a las líneas de comando de shell que ejecuta su script (recursivamente). Por ejemplo, si lo hiciera:
set -o allexport
uname() { echo Gotcha; }
somecmd
Y somecmd
estaba haciendo una popen("uname", "r")
para obtener el nombre de Unix, obtendría Gotcha
en los sistemas donde sh
está bash
en lugar del nombre real del sistema ( Darwin
, Linux
...).