Я использую screen для сохранения рабочего сеанса и подключения к одному сеансу с нескольких компьютеров. Как я могу настроить SSH и экран так, чтобы переменная XDISPLAY внутри моего постоянного сеанса экрана всегда была установлена на компьютере, с которого я сейчас подключаюсь?
т.е. Я запускаю сеанс экрана на работе и использую gvim, который использует X-сервер, работающий на моей рабочей машине. Позже я подключаюсь к тому же сеансу из дома и тоже хочу использовать gvim. Но на этот раз я хочу, чтобы gvim использовал X-сервер на моем домашнем компьютере. Я понимаю, что могу вручную обновлять XDISPLAY каждый раз, когда подключаюсь с другого компьютера, но я бы предпочел иметь автоматизированную систему.
Бонусные баллы, если я действительно могу переехать gvim с моей рабочей машины на мою домашнюю машину, пока она работает. Я пробовал xmove, но так и не смог заставить его играть хорошо.





Не существует «тривиального» способа изменить переменные среды во внешних процессах.
Простым решением может быть сохранение вашего XDISPLAY в файле при входе в систему и использование PROMPT_COMMAND для чтения этого файла перед выводом следующего приглашения.
Для перемещения приложений X посмотрите что-нибудь вроде X11vnc или Xvnc.
Ниже приведено решение вручную, но нет причин, по которым вы не могли используйте псевдоним или сценарий, чтобы это выполнялось автоматически при удаленном входе в систему.
Предполагая, что ваша локальная оболочка соответствующим образом устанавливает переменную DISPLAY,
вы можете использовать screen -X для отправки следующих команд на удаленный экран перед
подключение.
# set future remote shells started by screen to have the correct XDISPLAY
% screen -X "setenv XDISPLAY $DISPLAY" #...
# set up the keystroke F1 to update the XDISPLAY in current shells
% screen -X "bindkey -k k1 stuff export XDISPLAY=$DISPLAY\015" #...
Если вы знаете, что все ваши окна были оставлены в оболочке (а не в работающем редакторе или что-то в этом роде), вы можете использовать :at для изменения XDISPLAY, а не привязку клавиш:
# update the XDISPLAY in all current windows
% screen -X "at % stuff export XDISPLAY=$DISPLAY\015" #...
В качестве альтернативы, если вы знаете какой-либо способ получить значение переменной среды родительского процесса, вы можете использовать его вместе с обработчиком приглашения вашей оболочки, чтобы получить значение XDISPLAY на экране SCREEN (как установлено setenv) и обновить его для оболочки.