Вы можете запустить screen -S foo -X setenv DISPLAY "$DISPLAY"; screen -S foo -rd
чтобы изменить среду процесса screen
перед подключением. Это не повлияет на существующие окна.
Возможно, вы можете настроить свою оболочку на проверку обновленного DISPLAY
(и любой другой релевантной переменной, такой как XAUTHORITY
) каждый раз, когда они показывают приглашение. (Это означает, что вам, возможно, придется нажать Enter один раз, если оболочка сидела в приглашении, когда вы прикрепляли сеанс.) Bash оценивает $PROMPT_COMMAND
перед отображением каждого приглашения. Zsh запускает функцию precmd
перед отображением каждого приглашения. Например, если вы поместили нужные назначения среды в скрипт ~/var/run/screen-12345.foo.env-update.sh
(где 12345 - это pid процесса экрана, а foo
- имя сеанса), вы можете использовать что-то вроде (для zsh, не проверено; я не думаю, что вы сможете уйти, не разветвившись в bash):
precmd () {
local now=$SECONDS
set ~/var/run/"screen-$STY.env-update.sh"(Nms-$(($now-$screen_env_time)))
if [[ $# -ne 0 ]]; then
screen_env_time=$now
. ~/var/run/"screen-$STY.env-update.sh"
fi
}
Еще одна вещь, которую вы можете сделать из $PROMPT_COMMAND
или precmd
в некоторых операционных системах, это прочитать среду родительского процесса (это предполагает, что вы обновили среду экранного процесса). Например, в Linux с zsh (делайте это только при запуске под экраном):
precmd () {
local record
while read -r -d $'\0' record /proc/$PPID/environ; do
case ${record%%=*} in
DISPLAY|XAUHORITY) export $record;;
esac
done
}
Технически вы можете изменить среду другого процесса, используя отладчик. Но есть большая вероятность, что это приведет к сбою этого процесса, потому что внутренние структуры данных программы не будут совпадать с данными, хранящимися в ядре.
Обратите внимание, что ни одно из этих решений не принесет пользы, если вы запустите ssh в окне экрана.