2016-03-30 2 views
1

У меня есть сценарий с некоторыми функциями, которые загружаются в начале других скриптов для выполнения общей работы. Чтобы избежать повторной обработки, я пытаюсь создать некоторый вид кеша с некоторыми переменными области видимости сценария. Так что это моя проблема:Bash: использовать переменные между вызовами функций

предположив У меня есть этот сценарий:

functions.sh

#!/bin/bash 
v_cache= 

set_cache() 
{ 
    v_cache=1 
    echo 1 
} 
echo_cache() 
{ 
    echo "v_cache=$v_cache" 
} 

test.sh

#!/bin/bash 
. function.sh 

var=`set_cache` 
echo_cache 

set_cache 
echo_cache 

Вот результат:

$ ./test.sh 
v_cache= 
1 
v_cache=1 

Вызов функции в атрибуции (либо с `FUNC` или $ (Func)) имеют различный контекст, чем простой вызов. Мне нужно сохранить ту же область для всех вызовов функций в одном скрипте (например, test.sh).

Для приведенного выше примера, выход я ожидал это:

$ ./test.sh 
v_cache=1 
1 
v_cache=1 

Я пытался найти какое-то объяснение, почему он работает именно так, но не может нашел ничего. Я думаю, что `` запускает новый bash исполнение, полностью независимое.

Есть способ обмена переменной через все вызовы функций? Каковы альтернативы обхода этого поведения?

+0

Близко связано: http://stackoverflow.com/q/15541321/2088135 –

ответ

0

Если вы вызываете функцию.sh на ./function.sh в test.sh, будет запущена подпрограмма для запуска funtion.sh, поэтому значение переменной не будет храниться в оболочке, в которой выполняется test.sh ,

Вы должны вызвать функцию.sh от источник ./function.sh, чтобы запустить их в одной оболочке.

+0

'.' (используется в вопросе) и' source' ведут себя одинаково в bash. Участник не писал './Function.sh', они писали'. function.sh'. – Julian

+0

@Julian, thx для вашего комментария, я не знаю синтаксиса. function.sh в скрипте оболочки, я буду исследовать его. – gzh

2

«Неожиданное» поведение происходит из-за создания подсетей с помощью `` или $() в этой строке.

var=`set_cache` 

Когда подоболочка стартует, она создает его собственные переменную v_cache, устанавливает его в 1, и эхе-назад, чтобы установить вар в родительской оболочке. Затем подоболочка завершает работу, и вы эхо v_cache (oringal/parent shell), которая не установлена.

Есть разные поры мышления с функцией, с моего фона и языков, вы никогда не должны использовать функцию для изменения глобального, вы должны вместо этого вернуть значение для глобального. В этом случае измените свой var на v_cache. Другие люди (у которых должен быть другой фон, чем я) считают, что это кратковременное пришествие баха.

Смежные вопросы