Копия из среды распространяется на суб-оболочки, так это работает:
$ export MY_VAR=200
$ bash
$ echo $MY_VAR
200
но так как это копия, вы не можете получить это значение до родительской оболочки - по крайней мере, не изменяя среду.
Звучит так, будто вы действительно хотите пойти еще дальше: создать нечто, действующее как глобальная переменная, совместно используемую «родными» оболочками, инициированными отдельно от родителя, - как ваша новая вкладка в Gnome Terminal.
В большинстве случаев ответ таков: «Вы не можете, потому что переменные среды не работают таким образом». Тем не менее, есть другой ответ, который, ну, вы всегда можете взломать что-нибудь. Один из подходов - записать значение переменной в файл, например ~/.myvar
, и затем включить его в ~/.bashrc
. Затем каждая новая оболочка будет начинаться со значения, считанного из этого файла.
Вы могли бы пойти дальше - сделать так, чтобы ~/.myvar
быть в формате MYVAR=200
, а затем установить PROMPT_COMMAND=source ~/.myvar
, что приведет к тому, что значение будет перечитываться каждый раз, когда вы получаете новое приглашение. Это все еще не совсем общая глобальная переменная, но она начинает действовать так же. Он не будет активирован до тех пор, пока не вернется приглашение, что в зависимости от того, что вы пытаетесь сделать, может быть серьезным ограничением.
И затем, конечно, следующая вещь - автоматически записывать изменения в ~/.myvar
. Это становится немного сложнее, и я собираюсь на этом остановиться, потому что на самом деле переменные среды не должны были быть механизмом взаимодействия между оболочками, и лучше просто найти другой способ сделать это.
Это твоя ошибка прямо здесь. Вы должны определить переменные окружения
~/.profile
, которые читаются при входе в систему.~/.bashrc
Читаются при каждом запуске оболочки; когда вы запускаете внутреннюю оболочку, она переопределяетMY_VAR
. Если вы этого не сделали, ваша переменная окружения будет распространяться вниз.Для получения дополнительной информации о
~/.bashrc
против~/.profile
, см. Мои предыдущие сообщения на эту тему .Обратите внимание, что восходящее распространение (получение измененного значения из подоболочки автоматически отражается в родительской оболочке) невозможно, полная остановка.
источник
Рыбная раковина может сделать это с:
(см. http://fishshell.com/docs/current/commands.html#set )
Чтобы выполнить команду fish из другой оболочки, вы можете запустить
fish -c
, например:источник
Не используйте переменные среды вообще. Используйте файлы.
Чтобы процессы не наступали друг на друга при обновлении / чтении файла, используйте lockfiles и небольшие внешние сценарии обновления, цель которых - просто обновить файл с $ 1, если он не заблокирован. Блокировочные файлы реализуются, в основном, проверкой, существует ли определенный файл (/var/run/yourscript.lck), и если это так, подождите, пока файл не исчезнет, и потерпит неудачу, если его нет. Также вы должны удалить файл блокировки, когда закончите обновление файла.
Будьте готовы справиться с ситуацией, когда скрипт не может обновить файл, потому что файл занят.
источник
mkdir
работает как атомарное тестирование и создание.flock(2)
ln -s dummy lockfile
(даже если она не работает) может также работать, поскольку она не будет работать, если символическая ссылка уже существует. Интересно, какой-нибудь способ проверить, действительно ли это на 100% безопасно?Когда я только что погуглил этот вопрос, я пытался решить проблему обновления состояния (т. Е. Переменных оболочки) из подоболочек. Чтобы можно было назначать переменные, скажем, внутри конвейера - и назначение было бы прозрачно видимым для родителя.
Конечно, это не возможно простым способом, потому что отдельные части конвейера выполняются в подоболочках, которые
fork
редактируются из родительской оболочки и, следовательно, имеют память, которая является представлением копирования при записи в памяти родителя. Тем не менее, я предполагал, что тонкое и прозрачное решение может быть возможным на основе IPC типа « разделяемая память » .И я даже нашел реализацию именно этого дизайна ... но это на Perl.
Добавление этого ответа в любом случае в качестве возможного решения.
источник