"Exportar" una función usando export -f
crea una variable de entorno con el cuerpo de la función. Considere este ejemplo:
$ fn(){ echo \'\"\ \ \$; }
$ export -f fn
$ sh -c printenv\ fn
() { echo \'\"\ \ \$
}
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:
$ fn2='() { echo Hi;}' sh -c fn2
Hi
$ fn3='() {' sh -c :
sh: fn3: line 1: syntax error: unexpected end of file
sh: error importing function definition for `fn3'
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ón declare
integrada:
$ declare -pf fn
fn ()
{
echo \'\"\ \ \$
}
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:
#!/bin/bash
remote_main() {
local dest="$HOME/destination"
tar xzv -C "$dest"
chgrp -R www-data "$dest"
# Ensure that newly written files have the 'www-data' group too
find "$dest" -type d -exec chmod g+s {} \;
}
tar cz files/ | ssh user@host "$(declare -pf remote_main); remote_main"
#!/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.