Почему присвоение в функции игнорируется? - PullRequest
0 голосов
/ 28 мая 2019

Рассмотрим следующий код:

zzz=2

function f()
{
    zzz=4
}

$(f)
echo $zzz

Почему задание (zzz=4) игнорируется? Я думал, что знаю, что делает $( ) - он берет все написанное на стандартный вывод и дословно вставляет его туда, где он используется. Но почему это повлияет на присваивания глобальной переменной?

Ответы [ 4 ]

3 голосов
/ 28 мая 2019

Почему вы вообще называете это подобием?

zzz=2
f() { zzz=4; }
$(f)            # assigns COPY of zzz, then goes POOF
echo $zzz
f               # assigns to zzz
echo $zzz

Запустив его в подоболочке, вы создаете дочернюю среду, которая получает назначенную переменную, а затем испаряется.

1 голос
/ 28 мая 2019

В другом ответе правильно указано, что $() создаст подоболочку, и у вас будет отдельная среда выполнения от родительской оболочки.

zzz=2

function f()
{
   echo zzz=4
}

eval $(f)
echo $zzz

Вы можете решить эту проблему, используя eval. Сначала выведите требуемый оператор присваивания внутри функции, а затем оцените этот оператор в коде вызывающего.

Примечание: обратите внимание, что у eval есть некоторые предостережения, и их следует избегать, если вы точно не знаете, как работает ваш код.

1 голос
/ 28 мая 2019

Потому что $(...) работает в подоболочке. Изменения в подоболочке не видны в родительской оболочке.

С руководство по bash :

Bash выполняет расширение, выполняя команду в среде подоболочки ...

и подоболочка создает отдельный процесс, который имеет отдельную среду выполнения команд .

Это так же, как:

( 
   f
)

( .. ) также создает подоболочку, но не захватывает стандартный вывод.

0 голосов
/ 28 мая 2019

Удалить подоболочку вокруг f.

Предполагая, что вы действительно не используете подоболочку, код должен выглядеть примерно так:

zzz=2

function f()
{
    zzz=4
}

f
echo $zzz

Вы говорите, что функция f должна выполняться в другой оболочке, поэтому она не изменит varaible.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...