使用“导出”功能时,会使用export -f
功能主体创建一个环境变量。考虑以下示例:
$ fn(){ echo \'\"\ \ \$; }
$ export -f fn
$ sh -c printenv\ fn
() { echo \'\"\ \ \$
}
这意味着只有外壳程序(仅Bash?)才能接受该功能。您还可以自己设置函数,因为Bash仅考虑以() {
as 开头的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
:
$ 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"
#!/bin/sh
来#!/bin/bash
和后doit() {...}
刚export -f doit