Bir işlevi kullanarak "dışa aktarma" export -fişlev gövdesiyle bir ortam değişkeni yaratır. Bu örneği düşünün:
$ fn(){ echo \'\"\ \ \$; }
$ export -f fn
$ sh -c printenv\ fn
() { echo \'\"\ \ \$
}
Bu, yalnızca kabuğun (sadece Bash?) İşlevi kabul edebileceği anlamına gelir. Ayrıca, işlevi yalnızca Bash, işlev olarak başlayan envvarları kabul ettiği için kendiniz de ayarlayabilirsiniz () {:
$ 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'
Bu değişkeni SSH'ye "dışa aktarmanız" gerekiyorsa, gerçekten işleve bir dize olarak ihtiyacınız vardır. Bu , yerleşik -pfonksiyonların ( -f) baskı seçeneği ( ) ile yapılabilir declare:
$ declare -pf fn
fn ()
{
echo \'\"\ \ \$
}
SSH üzerinden yürütülmesi gereken daha karmaşık bir kodunuz varsa, bu çok kullanışlıdır. Aşağıdaki hayali senaryoyu inceleyin:
#!/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/shiçin#!/bin/bashve sonradoit() {...}sadeceexport -f doit