source some_file
algún_archivo:
doit ()
{
echo doit $1
}
export TEST=true
Si obtengo algún_archivo, la función "doit" y la variable TEST están disponibles en la línea de comando. Pero ejecutando este script:
script.sh:
#/bin/sh
echo $TEST
doit test2
Devolverá el valor de TEST, pero generará un error sobre la función desconocida "doit".
¿Puedo "exportar" la función también, o tengo que buscar algún_archivo en script.sh para usar la función allí?
#!/bin/sh
a#!/bin/bash
y despuésdoit() {...}
soloexport -f doit
#!/bin/sh
también, pero es una buena práctica usarla#!/bin/bash
para evitar problemas cuando el shell predeterminado no es bash.Respuestas:
En Bash puede exportar definiciones de funciones a sub-shell con
Por ejemplo, puedes probar este sencillo ejemplo:
./script1
:./script2
:Entonces, si llama
./script1
, verá la salida ¡Hola! .fuente
"Exportar" una función usando
export -f
crea una variable de entorno con el cuerpo de la función. Considere este ejemplo:Esto significa que solo el shell (¿solo Bash?) Podrá aceptar la función. También puede configurar la función usted mismo ya que Bash solo considera envvars que comienzan
() {
como una función:Si necesita "exportar" esta variable a través de SSH, entonces realmente necesita la función como una cadena. Esto se puede hacer con la opción de impresión (
-p
) para las funciones (-f
) de la funcióndeclare
integrada:Esto es muy útil si tiene un código más complejo que debe ejecutarse a través de SSH. Considere el siguiente script ficticio:
fuente
fn2='() { echo Hi;}' sh -c fn2
no funciono para mi En arch linux consh
siendo bash v5.0.7 obtuvesh: fn2: command not found
. En Ubuntu consh
siendo dash v0.2.3 obtuvesh: 1: fn2: not found
. ¿Quésh
caparazón usaste?f(){ echo a;}; export -f f; echo "$f"; sh -c 'printenv f; echo "$f"'
no imprime nada para mí, por lo que claramentef
no se exporta como una cadena simple. Probé con las dos combinaciones mencionadas anteriormente.sh
ejecutar esa cadena como una función? En su ejemplo,fn2='() { echo Hi;}' sh -c fn2
el comandofn2
dadosh
es literalmente la cadena"fn2"
.sh
debería buscar dicho comando en su RUTA, pero no debería buscar si hay una variable$fn2
, expandir esa variable y ejecutar su valor como una función; me parece un problema de seguridad importante. editar: creo que eso es todo! ¿Fue su comportamiento mostrado el error de seguridad conocido como ShellShock / Bashdoor ?fn(){ echo foo; }; export -f fn; env | grep foo
salidasBASH_FUNC_fn%%=() { echo foo
Sobre la base de la respuesta de @ Lekensteyn ...
Si lo usa
declare -pf
, enviará todas las funciones definidas previamente en el shell actual a STDOUT.En ese momento, puede redirigir STDOUT a donde quiera y, de hecho, rellenar las funciones definidas previamente donde quiera.
La siguiente respuesta los convertirá en una variable. Luego, hacemos eco de esa variable más la invocación de la función que queremos ejecutar en el nuevo shell que se genera como un nuevo usuario. Hacemos esto mediante el uso
sudo
del-u
modificador (también conocido comouser
) y simplemente ejecutando Bash (que recibirá el STDOUT canalizado como entrada para ejecutar).Como sabemos que vamos de un shell Bash a un shell Bash, sabemos que Bash interpretará correctamente las funciones definidas de shells anteriores. La sintaxis debe estar bien siempre que nos traslademos entre un shell Bash de la misma versión a un nuevo shell Bash de la misma versión.
YMMV si se está moviendo entre diferentes shells o entre sistemas que pueden tener diferentes versiones de Bash.
fuente
No puede exportar funciones, no de la manera que está describiendo. El shell solo cargará el
~/.bashrc
archivo al inicio de un shell interactivo (busque "Invocación" en la página de manual de bash ).Lo que puede hacer es crear una "biblioteca" que se carga cuando inicia el programa:
Y coloque sus funciones y configuraciones no interactivas allí.
fuente
BASH_ENV
una variable de entornosome_file
que ya tiene, y se llamaría. Sería bastante fácil descubrirlo:echo echo foobar > /tmp/foobar; BASH_ENV=/tmp/foobar $SHELL -c :
eval "$(declare -F | sed -e 's/-f /-fx /')"
exportará todas las funciones.Hago esto mucho antes de comenzar un shell interactivo en un script para permitirme depurar y trabajar en el contexto del script mientras uso sus funciones y variables.
Ejemplo:
fuente
Las funciones no se exportan a subprocesos. Es por eso que hay archivos llamados .kshrc o .bashrc: para definir funciones que también deberían estar disponibles en subcapas.
Si ejecuta una secuencia de comandos, las secuencias de comandos. * Shrc normalmente no se obtienen. Tendría que codificar eso explícitamente, como en
. ~/.kshrc
.fuente
rm=rm -i
)Bueno, soy nuevo en Linux, pero puedes probar esto. En algún archivo, llamémoslo, 'tmp / general' construyes tu función:
En su script de shell, agregue:
y correr:
Usted obtendrá en la pantalla:
func from general
.fuente
Más información
fuente