呼び出し側で複数の変数を効果的に宣言して割り当てる必要がある関数(=callee)があります。また、発信者の名前が何であるかを知ることができるはずです。
eval
これで、呼び出し元が編集した渡された変数に文字列を返すことで、電子を実行します。
write_local_var_assignments variable_name; eval "$variable_name"
"$FUNCNAME"
私は、呼び出し側を通過させるか、呼び出し側に組み込みcaller
関数を呼び出してその出力を解析することで後者を達成できると思います。
これらすべての解決策は不器用なように見えるので、2つの質問があります。
- 呼び出し受信者は、呼び出し元の協力なしに呼び出し元のコンテキストにローカル変数を割り当てることができますか?
つまり、次のように圧縮できます。
write_local_var_assignments variable_name; eval "$variable_name"
今すぐ入場してください
run_local_var_assignments
?
- 関数呼び出し元の名前を取得するより良い方法はありますか?構文解析や命令置換なしですぐに結果を得ることができれば良いようです。
ベストアンサー1
bash
(およびksh88
、、、、)では、mksh
ローカルyash
変数の範囲は動的です。dash
zsh
このコードは:
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
用の変数です。$a
g
typeset
これは、inを使用して宣言された変数、構文()を使用して宣言された関数、またはinを使用して宣言された変数とは対照的です。ここで以下を取得します。ksh
function f { ...; }
ksh93
private
zsh
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