2016-05-04 8 views
0

以下の構造を持つunixスクリプトを作成しようとしています。基本的に、私はいつも使っている関数の "ライブラリ"スクリプトを持っていて、export -f functionNameを使ってすべての関数をエクスポートします。ライブラリ関数を使用する実際のスクリプトは、まずライブラリスクリプトを実行してエクスポートコマンドを実行し、理論的にエクスポートされたばかりの関数にアクセスします。ただし、これはエラーで示されているように機能しません。どちらのスクリプトもテスト用にchmod 777になっています。私は以下の例を文字通り試しています。これらはどこかのプロードコードの代用品ではありません。私は何をしようとしているものをコピーして貼り付けた。Bash:エクスポートされた関数が別のスクリプトに見つかりません

LibraryFunctions.sh:

#!/bin/bash 

function getHelloWorldString() { 
    echo "Hello World" 
} 
export -f getHelloWorldString 

TestLibraryFunctions.sh

#!/bin/bash 

./LibraryFunctions.sh 

function testExportedHelloWorld() { 
    echo $(getHelloWorldString) 
} 
testExportedHelloWorld 

結果:

[email protected]:~/testDir $ ./TestLibraryFunctions.sh 
./TestLibraryFunctions.sh: line 6: getHelloWorldString: command not found 

編集:私のために働いたソリューション:

TestLibraryFunctions.sh

から./LibraryFunctions.shを削除LibraryFunctions.sh

からexport -f getHelloWorldStringを削除

はトップ

でTestLibraryFunctions.shからsource LibraryFunctions.shを追加しました-------新しいファイル------ :

LibraryFunctions.sh:

#!/bin/bash 

function getHelloWorldString() { 
    echo "Hello World" 
} 

テストLibraryFunctions.sh

#!/bin/bash 

source LibraryFunctions.sh 

function testExportedHelloWorld() { 
    echo $(getHelloWorldString) 
} 
testExportedHelloWorld 

ありがとうございます!

+2

'に変更してください。 。/ LibraryFunctions.sh'を実行すると、作業が開始されます。 – Harald

+3

この場合、 'export'は必要ありません。それは、あなたがここで使用していないものをサブシェルで利用できるようにします。 – Harald

+0

Harald氏は 'LibraryFunctions.sh'を独自のスクリプトとして実行しているので、独自のシェルセッションで実行しています。 'export'された関数と変数が見えるように、現在のシェルセッションにソース(' .')を入れる必要があります。 –

答えて

2

変数または関数をエクスポートすると、exportを実行したシェルの子プロセスでのみ使用できます。シェルスクリプトを実行するなど、コマンドを実行すると、そのスクリプトは子プロセスで実行されます。したがって、元のTestLibraryFunctions.shプロセスの子にLibraryFunctions.shを実行しています。元のスクリプトに戻ると、あなたはLibraryFunctions.shの子ではないため、エクスポートされた関数は表示されません。

現在のプロセスと同じプロセスでシェルスクリプトを実行する場合は、sourceまたは.コマンドを使用してシェルスクリプトを実行します。

source LibraryFunctions.sh 

あなたがこれを行う場合は、定義が同じシェルプロセスで起こるので、あなたは、機能をexportする必要はありませんし、それを使用する必要がある子のシェルプロセスが存在しないことに注意してください。

+0

これはトリックでした。ありがとうございました。 – R4F6

+0

私は今、これが私が望んでいたより良い解決策であることに気付きました。なぜなら、これらすべての機能のエクスポートを管理する必要がないからです。 – R4F6

関連する問題