回答:
接続する前screen -S foo -X setenv DISPLAY "$DISPLAY"; screen -S foo -rd
に、screen
実行してプロセスの環境を変更できます。これは、既存のウィンドウには影響しません。
プロンプトを表示するたびに、更新されたDISPLAY
(およびのような他の関連変数XAUTHORITY
)をチェックするようにシェルを構成できます。(つまりEnter、セッションを接続したときにシェルがプロンプトに座っていた場合、1回押す必要がある場合があります。)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
、オペレーティングシステムによっては、親プロセスの環境を読み取ることもできます(これは、画面プロセスの環境を更新したことを前提としています)。たとえば、zshを搭載したLinux(画面下で実行している場合のみこれを実行します):
precmd () {
local record
while read -r -d $'\0' record /proc/$PPID/environ; do
case ${record%%=*} in
DISPLAY|XAUHORITY) export $record;;
esac
done
}
技術的には、デバッガを使用して別のプロセスの環境を変更できます。しかし、プログラムの内部データ構造はカーネルが保持するデータと一致しないため、そのプロセスがクラッシュする可能性があります。
画面ウィンドウ内でsshを実行した場合、これらのソリューションはどれも役に立たないことに注意してください。
Gilesのソリューションは最も一般的なものであると思いますが、2つの欠点があります。(1)コマンドを実行した後、再アタッチした後、および(2)コマンドが毎回実行されるまで動作しませんコマンド・プロンプト。(私が言えることは、CPUサイクルの浪費が嫌いだということです)。別の方法もありますが、完全ではありません。screen
前のウィンドウとは異なるサイズの端末に再接続すると、シェルに信号をscreen
送信しSIGWINCH
ます。
trap some_function SIGWINCH
この事実を利用して、デタッチされた端末を再接続するときにSSH_AUTH_SOCKおよび関連する変数の書き換えを処理するシェルスクリプト(.bashrcをソースとする)を作成しました。:ここでのプロジェクトを参照してくださいhttps://gitlab.com/otheus.uibk/bashrc-ssh-agentを。スクリプトは、PROMPT_COMMANDと統合するように簡単に変更できます。
screen
再接続時にSIGWINCHを強制するオプションを使用して更新できますか?現在4.1.0(RedHat 7に同梱)を使用していますが、現在のバージョンは4.6です。
cat /tmp/screen_variable
。それを自動化したいだけです。