LINUX.ORG.RU

Непонятное поведение environment variable

 ,


0

1

Есть следующий код:


full_name="Franky M. Singh"

export full_name

bash

export full_name="Charles the Great"

exit

echo $full_name

Последняя команда выдаёт «Franky M. Singh» вместо «Charles the Great». Почему так? Я думал что если экспортирую переменную, то её значение станет везде одинаковым. То есть, что environment variable это фактически глобальная переменная.

Deleted

Последнее исправление: Deleted (всего исправлений: 4)

Почему так?

Ты можешь изменить переменную окружения только для дочерних процессов. Переменные окружения родительского процесса изменить нельзя.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Минуточку, а разве переменные окружения это не аналог глобальных переменных? То есть, я ожидал что переменные окружения будут одинаково доступны как для родителя, так и для ребёнка.

Но если это не так, то тогда в чём разница между локальными переменными, которые разумеется у всех процессов свои, и переменными окружения?

Deleted
()
Ответ на: комментарий от Deleted

Когда ты создаёшь процесс (вызов bash в твоём коде), он получает копию переменных окружения текущего процесса. В дочернем коде ты меняешь не переменную окружения родителя, ты меняешь собственную копию.

Но если это не так, то тогда в чём разница между локальными переменными, которые разумеется у всех процессов свои, и переменными окружения?

В том, что копия переменных окружения родительского процесса доступна для всех дочерних процессов. Обычные переменные для дочерних процессов недоступны.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

То есть у нас такая аналогия: есть дедушка у которого есть несколько сыновей и карта сокровищ. Дедушка даёт каждому сыну ксерокопию карты. Потом один из его сыновей сделал какие-то изменения на своей ксерокопии карты (скажем перевёл названия с древнего языка на современный) и дал ксерокопии этой измененной ксерокопии своим сыновьям.

Ну а локальные переменные тут это бумаги которыми родители со своими детьми не намерены делиться ни в каком виде, даже в виде ксерокопии. Например письма от любовницы, хе-хе.

Deleted
()
Ответ на: комментарий от Deleted

У каждого процесса свое окружение, у окружения есть переменные. «Локальных» переменных вообще не существует - это внутрення «кухня» баша (или другого шела) и к системной «кухне» процессов оно никакого отношения не имеет.

При порождении нового процесса он получает КОПИЮ окружения родителя, эта копия полностью самостоятельня и ни с кем не связана.

zaz ★★★★
()

Я думал что

Твои маняфантазии никого не волнуют. Окружение субпроцесса не влияет на окружение родителя, если это не предусмотрено явным образом.

anonymous
()
Ответ на: комментарий от anonymous

Твои фантазии никого не волнуют.

Вы лжец. Как минимум Вам было настолько НЕбезразлична моя «фантазия» что Вы написали мне ответ об том что там происходит «на самом деле».

Deleted
()
Ответ на: комментарий от Deleted

Нет, аналогия у нас такая. Есть процесс. Под процесс выделен кусок памяти, в котором хранятся все его переменные. Процесс форкается. Теперь есть две копии процесса с одинаковыми переменными. Локальных переменных нет. Не верь им, это ло

anonymous
()

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

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от anonymous

он получает копию переменных окружения текущего процесса

Бред сивой кобылы. man execve

Что «man execve»? Намекаешь, что есть параметр envp, который можно забить чем угодно? Ну так шелл его и использует для передачи окружения.

Jini ★★
()
Ответ на: комментарий от Jini

Ты отличаешь понятие «частный случай» от «общий случай»?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.