screen上に新規作成した別windowに環境変数一つを引き継ぐ方法

こんなことないですか?

  1. screenを立ち上げてwindowを一つ開く。
  2. そのwindow上である一つの環境変数を設定する。
  3. screen上にもう一つwindowを開く。
  4. 2で設定した環境変数が新しいwindowに引き継がれてない!

上記の状況を改善する方法です。

方法のポイント

1.普段 export で環境変数(例:XTEST)を設定するところ、以下のようにwrapした別の関数で行うようにし、それに併せて screen の環境変数に設定するようにします。

function export_xtest {
    export XTEST=$1
    screen -X eval "setenv SCREEN_XTEST ${XTEST}"
}

2.そしてscreen上にwindowを開いたとき、XTESTにscreenの環境変数を引き取るようにします。

bind c eval 'screen 1' 'echo "export XTEST=$SCREEN_XTEST"'

設定例

.bashrc
if [ -n "$XTEST" ]; then
    export XTEST=$XTEST
fi
if [ -n "$SCREEN_XTEST" ]; then
    export XTEST=$SCREEN_XTEST
    unset SCREEN_XTEST
fi

if [ -n "$XTEST" ]; then
    PS1="[\u@\h:\w $XTEST] \$ "
else
    PS1="[\u@\h:\w] \$ "
fi

function export_xtest {
    export XTEST=$1
    tscreen -X eval "setenv SCREEN_XTEST ${XTEST}"
    source ${HOME}/.bashrc
}
.screenrc
hardstatus alwayslastline '%m/%d %02c:%s %{= .g}%H%{-} %L=%-w%45L>%{=u g.}%n %t%{-}%+w %-17<%=%{= .y}(%l)'
screen 1
bind c eval 'screen 1' 'echo "export XTEST=$SCREEN_XTEST"'

実行例

1.screenを起動します。

2.環境変数を設定します。

3.新たなwindowを開きます。環境変数が引き継がれていることがわかります。

4.環境変数を上書きします。

5.新たなwindowを開きます。上書かれた環境変数が引き継がれていることがわかります。