¿Cómo "exportar" funciones en bash?

¿Cómo "exportar" funciones en bash?

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 myfile2para que todos las conozcan?

No puedo usarlo export -fporque hay muchas funciones.

Respuesta1

Tenga en cuenta que bashno lo es sh. export -fes específico del bashcaparazó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 bashfunciones 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 .shextensiones a los guiones escritos en el bashidioma es un poco engañoso.

Now bashes 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 -fcomando específico de bash. bashTambién exporta todas las funciones que se declaran mientras la allexportopción está activada.

Pero en cualquier caso, ninguno de los dos funcionaría en su caso. exporting 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.sho myfile2.shexportaran las funciones que declararon (con export -fo teniendo una set -o allexportdeclaración de variable antes), eso solo afectaría los shells que ejecutaría el shell que interpreta esos scripts. Aquí myfile2.shno se está ejecutando myfile3.sh, es al revés.

Aquí necesitarías que tu myfile3.shscript hiciera:

source path/to/myfile2.sh

de modo que sea el mismo shell el que interprete el código en todos los myfile1.shscripts myfile2.shy myfile3.sh, y entonces no sería necesario exportar ninguna función.

Tenga en cuenta que en los sistemas donde shestá 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 somecmdestaba haciendo una popen("uname", "r")para obtener el nombre de Unix, obtendría Gotchaen los sistemas donde shestá bashen lugar del nombre real del sistema ( Darwin, Linux...).

información relacionada