Функция распознавания вызывающего абонента в bash

У меня есть функция (= calllee), которая должна эффективно объявлять и назначать пару переменных в своем вызывающем. Он также должен быть в состоянии сказать, что это имя вызывающего.

На данный момент я достигаю первого, возвращая запись в переданную переменную строкой, которая должна быть eval вызывающей.

  write_local_var_assignments variable_name; eval "$variable_name" 

Я предполагаю, что я смогу добиться последнего, либо передав вызывающему абоненту "$FUNCNAME" либо получив вызов caller и проанализировав его вывод.

Все эти решения кажутся очень неуклюжими, поэтому у меня есть два вопроса:

  1. Возможно ли, чтобы вызывающий абонент назначил локальные переменные в контекст вызывающего, без взаимодействия вызывающего абонента?

Т.е. я могу сжать:

  write_local_var_assignments variable_name; eval "$variable_name" 

просто

  run_local_var_assignments 

?

  1. Есть ли лучший способ получить имя вызывающего абонента функции? Было бы неплохо получить результат напрямую без синтаксического анализа или подстановки команд.

  • / bin / sh: определение функции импорта ошибок для `some-function '
  • Декоратор функции Bash
  • Ошибка сегментации при вызове рекурсивной функции bash
  • Псевдоним и функции
  • Как выполнить 'find' с 'sed' в функции bash
  • В чем разница между `autoload` и` autoload -U` в Zsh?
  • bash, возврат из перенаправленного цикла, безопасен ли он?
  • bash: синтаксическая ошибка возле неожиданного токена
  • One Solution collect form web for “Функция распознавания вызывающего абонента в bash”

    В bashksh88 , ksh88 , mksh , 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 's $a переменную, потому что она вызывается из g .

    Это контрастирует с переменными, объявленными с помощью typeset в функциях, объявленных с синтаксисом 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 
    Linux и Unix - лучшая ОС в мире.