Bashで関数を「エクスポート」できますか?

Bashで関数を「エクスポート」できますか?
source some_file

一部_ファイル:

doit ()
{
  echo doit $1
}
export TEST=true

私がソースだったら一部のファイル"doit"関数とTEST変数はコマンドラインで使用できます。ただし、次のスクリプトを実行してください。

スクリプト.sh:

#/bin/sh
echo $TEST
doit test2

TEST値が返されますが、不明な関数「doit」のエラーが発生します。

関数も「エクスポート」できますか?または、そこで関数を使用するには、script.shからsome_fileを取得する必要がありますか?

答え1

Bashでは、スクリプトが呼び出す他のシェルスクリプトに関数定義をエクスポートできます。

export -f function_name

たとえば、次の簡単な例を試すことができます。

./script1:

#!/bin/bash

myfun() {
    echo "Hello!"
}

export -f myfun
./script2

./script2:

#!/bin/bash

myfun

その後、電話すると./script1出力が表示されます。こんにちは!

答え2

「エクスポート」関数を使用すると、export -f関数本体を含む環境変数が生成されます。次の例を考えてみましょう。

$ fn(){ echo \'\"\ \ \$; }
$ export -f fn
$ sh -c printenv\ fn
() {  echo \'\"\ \ \$
}

つまり、シェル(Bashのみ?)だけがこの機能を許可できます。 Bashは() {as関数で始まる環境変数のみを考慮するので、関数を直接設定することもできます。

$ 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組み込み関数()の印刷オプション()を使用してこれを行うことができます-fdeclare

$ 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"

答え3

確立された@Lekensteinからの返信...

を使用すると、declare -pf現在のシェルで以前に定義されたすべての関数がSTDOUTに出力されます。

この時点で、STDOUTを目的の場所にリダイレクトし、実際に必要な場所に以前に定義された関数を入力できます。

以下の答えはこれを変数に埋めます。次に、その変数と新しいユーザーで作成された新しいシェルで実行したい関数の呼び出しをエコーし​​ます。 (別名)sudoスイッチを使用してBashを実行します(パイプされたSTDOUTを実行入力として受け取ります)。-uuser

BashシェルからBashシェルに移動することを知っているので、Bashは以前のシェルで定義した機能を正しく解釈することを知っています。同じバージョンの Bash シェルから同じバージョンの新しい Bash シェル間を移動する限り、構文は問題ありません。

異なるシェル間または異なるバージョンのBashがある可能性があるシステム間で移動する場合YMMV。

#!/bin/bash
foo() {
  echo "hello from `whoami`"
}

FUNCTIONS=`declare -pf`; echo "$FUNCTIONS ; foo" | sudo -u otheruser bash
# $./test.sh
# hello from otheruser

答え4

eval "$(declare -F | sed -e 's/-f /-fx /')"輸出するみんな機能。

関数と変数の使用中にスクリプトのコンテキストでデバッグして操作できるように、スクリプトで対話型シェルを起動する前にこれを行うことがよくあります。

例:

eval "$(declare -F | sed -e 's/-f /-fx /')"
export SOME IMPORTANT VARIABLES AND PASSWORDS
bash -i

関連情報