"Экспорт" функции с помощью экспорта -f
создает переменную окружения с телом функции. Рассмотрим этот пример:
$ fn(){ echo \'\"\ \ \$; }
$ export -f fn
$ sh -c printenv\ fn
() { echo \'\"\ \ \$
}
Это означает, что только оболочка (только Бэш?) сможет принять функцию. Вы также можете установить функцию самостоятельно, так как Бэш рассматривает envvars только начиная с () {
как функцию:
$ 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'
Если вам нужно "экспортировать" эту переменную по SSH, то вам действительно нужна функция в виде строки. Это можно сделать с помощью опции печати (-p
) для функций (-f
) встроенного объявления -
:
$ declare -pf fn
fn ()
{
echo \'\"\ \ \$
}
Это очень полезно, если у вас есть более сложный код, который нужно выполнить по SSH. Рассмотрим следующий вымышленный сценарий:
#!/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"