を使用して関数を「エクスポート」するとexport -f
、関数本体で環境変数が作成されます。この例を考えてみましょう:
$ fn(){ echo \'\"\ \ \$; }
$ export -f fn
$ sh -c printenv\ fn
() { echo \'\"\ \ \$
}
これは、シェル(Bashだけ?)のみが関数を受け入れることができることを意味します。Bashはenvvarsをfunctionで始まると見なすだけなので、自分で関数を設定することもでき() {
ます。
$ 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