
次のコードを使用して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_function
dispatch を使いたいときはいつでも、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_function
1行だけであれば、上記の内容を次のように単純化できます。
親関数() { その他のコマンド デリゲート機能 その他のコマンド }
;
PS:行の末尾に使用する必要はありません。同じ行に複数の項目を配置する場合にのみ区切り文字として使用してください。