bashシェル変数での関数の使用に関するこの投稿を読んでいます。シェル関数を使用するには、次のようにそれらをエクスポートして子シェルで実行する必要があることに気付きました。
$ export foo='() { echo "Inside function"; }'
$ bash -c 'foo'
Inside function
関数をbashシェル変数で定義して、エクスポートを使用せずに新しいシェルを実行せずに現在のシェルで実行できるようにすることは可能かどうかを尋ねたいですか?
承認された回答:
いいえ、できません。
現在のシェルで関数を使用する場合は、関数を定義して後で使用します。
$ foo() { echo "Inside function"; }
$ foo
Inside function
Shellshockの前は、関数を変数内に格納し、変数をエクスポートし、関数をサブシェルで使用できます。これは、bash
エクスポート機能、bash
をサポート 関数定義を次のような環境変数に入れます:
foo=() {
echo "Inside function"
}
次に、replace =
で関数を解釈します スペースあり。関数を変数に入れる意図はなく、変数を参照すると関数が実行されます。
現在、StéphaneChazelasがバグを発見した後、その機能は削除され、関数定義はプレーン環境変数に保存されなくなりました。エクスポートされた関数は、プレフィックスBASH_FUNC_
を追加することでエンコードされます。 接尾辞%%
環境変数との衝突を避けるため。 bash
インタプリタは、変数の内容に関係なく、それらがシェル関数であるかどうかを判断できるようになりました。また、サブシェルで使用するには、関数を定義して明示的にエクスポートする必要があります。
$ foo() { echo "Inside function"; }
$ export -f foo
$ bash -c foo
Inside function
とにかく、あなたの例があなたの現在のbash
でうまくいったなら 、次に脆弱なバージョンを使用しています。