Я использую linux, и мне нравится выполнять всю работу с командной строкой в рамках одного сеанса экрана, чтобы я мог перезапустить свой графический вход в систему и тому подобное, не теряя свои терминалы. Однако, когда я выхожу из системы и возвращаюсь в свой графический сеанс, это меняет все переменные среды моего сеанса, такие как сеансы DBus. Это означает, что после повторного входа в систему мой экранный сеанс теперь имеет старые (и неправильные) переменные среды. Поэтому теперь, когда я пытаюсь запустить графические программы из моего сеанса экрана, в лучшем случае они выдают предупреждение о невозможности подключения к сеансовой шине. В худшем случае они не запускаются полностью.
Итак, я ищу способ изменения переменных окружения в работающем экземпляре экрана, чтобы все создаваемые впоследствии окна экрана наследовали новые переменные среды. Есть ли способ сделать это?
источник
setenv [var [string]] Set the environment variable var to value string. If only var is specified, the user will be prompted to enter a value. If no parameters are specified, the user will be prompted for both variable and value. The environment is inherited by all subsequently forked shells.
Ответы:
Вы не можете запустить сценарий оболочки из
screen
сеанса, поскольку он унаследует старую среду. Однако вы можете использовать fifo для добавления новых переменных среды в старый сеанс экрана. Вы можете заполнить этот fifo, когда начнете свой графический сеанс.Запустите этот скрипт в фоновом режиме при входе в систему (он будет завершен только после чтения всех переменных из него).
Теперь вы можете читать с fifo, например, добавить эту функцию в свой
.bashrc
так что вы можете в своей старой
screen
сессииисточник
screen
. AFAIK неscreen
предоставляет никаких сокетов или подобных устройств для связи с запущенными сеансами извне.screen
сессии уже есть последние переменные средыЯ реализовал скрипт для этого. Вы можете получить его здесь: https://github.com/DarwinAwardWinner/screen-sendenv
После добавления
screen-sendenv.py
в ваш$PATH
, вы можете использовать следующий фрагмент в вашем .bashrc:Чтобы использовать его, просто запустите
screen_pushenv
перед тем,screen -r
как снова подключиться к экранной сессии. Затем, после подключенияscreen -r
, вы можете обновить среду в существующих оболочках с помощьюscreen_pullenv
. Функции tmux выполняют то же самое для tmux, другого терминального мультиплексора, похожего на screen.источник
screen_update
иtmux_update
функциях. Я обновлю свой ответ независимой от них версией этого.setenv
я вижу, как это лучше. Это не было очевидно из кода, на который вы ссылались. Еще раз спасибо!Вы можете вызвать
setenv
команду, чтобы изменить переменные среды в процессе экрана в интерактивном режиме, используя: Ctrl- A+:setenv
(запишите:
символ для ввода команды экрана.) Вам будет предложено ввести имя и значение переменной среды.Обратите внимание, что (как и в других ответах / комментариях) это влияет на (родительский) процесс экрана и, следовательно, на вновь созданные сеансы экрана, но не на текущий сеанс экрана или на существующие сеансы экрана.
Вы можете указать имя и значение переменной среды одновременно, если хотите: Ctrl- A+
:setenv DISPLAY :100
. Установите для DISPLAY значение «: 100» для новых сеансов экрана.Чтобы удалить переменную окружения, вы можете использовать 'unsetenv' - например, Ctrl- A+
:unsetenv DISPLAY
источник
Это, вероятно, более простое решение (вы решаете). Важной частью является псевдоним, который вызывает
savedisplay
функцию при каждомscreen
запуске команды. Команды не запускаются автоматически, поэтому могут быть вставлены~/.bashrc
вместо чего-то очень специализированного, например~/.ssh/rc
.источник