Bashの発呼者認識機能

Bashの発呼者認識機能

呼び出し側で複数の変数を効果的に宣言して割り当てる必要がある関数(=callee)があります。また、発信者の名前が何であるかを知ることができるはずです。

evalこれで、呼び出し元が編集した渡された変数に文字列を返すことで、電子を実行します。

 write_local_var_assignments variable_name; eval "$variable_name"

"$FUNCNAME"私は、呼び出し側を通過させるか、呼び出し側に組み込みcaller関数を呼び出してその出力を解析することで後者を達成できると思います。

これらすべての解決策は不器用なように見えるので、2つの質問があります。

  1. 呼び出し受信者は、呼び出し元の協力なしに呼び出し元のコンテキストにローカル変数を割り当てることができますか?

つまり、次のように圧縮できます。

 write_local_var_assignments variable_name; eval "$variable_name"

今すぐ入場してください

 run_local_var_assignments

  1. 関数呼び出し元の名前を取得するより良い方法はありますか?構文解析や命令置換なしですぐに結果を得ることができれば良いようです。

ベストアンサー1

bash(およびksh88、、、、)では、mkshローカルyash変数の範囲は動的です。dashzsh

このコードは:

f() { a=2; echo "f: $a"; }
g() { local a=1; f; echo "g: $a"; }
a=0
g
echo "global: $a"

次の出力を生成します。

f: 2
g: 2
global: 0

から呼び出されるf更新g用の変数です。$ag

typesetこれは、inを使用して宣言された変数、構文()を使用して宣言された関数、またはinを使用して宣言された変数とは対照的です。ここで以下を取得します。kshfunction f { ...; }ksh93privatezsh

f: 2
g: 1
global: 2

したがって、この場合は何もする必要はありません。

呼び出す関数の名前を知るには、bash次のように使用できます。${FUNCNAME[1]}

これに対応するzshのは次のとおりです$funcstack[2]

$ zsh -c 'f() { echo $funcstack[2]; }; g() { f; }; g'
g
$ bash -c 'f() { echo "${FUNCNAME[1]}"; }; g() { f; }; g'
g

おすすめ記事