evalを使用してbash関数を動的に定義する

evalを使用してbash関数を動的に定義する

次のコードを使用してbash関数を動的に定義しようとしています。

delegate_function() { echo "output from delegate"; }
eval "parent_function() { echo $(delegate_function); }"

目的は、実行時に親関数がデリゲートに動的に渡されるようにすることです。しかし、evalどのように機能するかによって、私の機能は次のように定義されます。

kshitiz:/tmp$ type parent_function
parent_function is a function
parent_function () 
{ 
    echo output from delegate
}

定義を次のように変更するにはどうすればよいですか?

 parent_function () 
 { 
     echo $(delegate_function);
 }

評価される文字列の特定の部分を防ぐ方法はありますかeval

答え1

Bashでは、ほとんどの言語と同様にevalこれを避ける必要があります。たとえば、Greg のよくある質問をご覧ください。評価コマンドとセキュリティの問題

parent_function次のように定義できます。

parent_function=delegate_function

parent_functiondispatch を使いたいときはいつでも、delegate_function以下を実行してください:

$ $parent_function
output from delegate

動的機能更新の例

定義delegate_functionしてparent_function実行してみましょう$parent_function

$ delegate_function() { echo "delegate version 1"; }
$ parent_function=delegate_function
$ $parent_function
delegate version 1

delegate_functionそれでは、変更してやり直してみましょう$parent_function

$ delegate_function() { echo "delegate version 2"; }
$ $parent_function
delegate version 2

$parent_function新しいバージョンのDelegate_functionを実行するには、今すぐ更新してください。

名前を動的に選択する例

デリゲート関数を作成しましょう。

$ delegate_function() { echo "delegate function executed"; }

いくつかの名前を付けてみましょう。

$ parent_function=some_name

次に、この名前の動的割り当てを見てみましょう。

$ typeset $parent_function=delegate_function
$ $some_name
delegate function executed

答え2

$これを行うには、エスケープだけで十分です。

eval "parent_function() { echo \$(delegate_function); }"

答え3

たとえば、他の項目でparent_function生成された出力が必要な場合delegate_function

親関数()
{
    その他のコマンド
    echo$(委任機能)
    その他のコマンド
}

さて、出力がdelegate_function1行だけであれば、上記の内容を次のように単純化できます。

親関数()
{
    その他のコマンド
    デリゲート機能
    その他のコマンド
}

;PS:行の末尾に使用する必要はありません。同じ行に複数の項目を配置する場合にのみ区切り文字として使用してください。

関連情報