web-dev-qa-db-ja.com

新しいグラフィカルログインを反映するようにスクリーンセッション環境変数を更新しますか?

私はLinuxを使用しており、すべてのコマンドライン作業を1つの画面セッションで実行するのが好きです。これにより、端末を失うことなく、グラフィカルログインなどを再開できます。ただし、ログアウトしてグラフィカルセッションに戻ると、DBusセッションなどのすべてのセッション環境変数が変更されます。つまり、再度ログインすると、私のスクリーンセッションに古い(そして間違った)環境変数が含まれるようになります。したがって、スクリーンセッションからグラフィカルプログラムを起動しようとすると、せいぜい、セッションバスに接続できないという警告が表示されます。最悪の場合、完全に起動できません。

したがって、私が探しているのは、実行中のscreenインスタンスで環境変数を変更して、その後作成されるすべてのscreenウィンドウが新しい環境変数を継承する方法です。これを行う方法はありますか?

20

これを行うためのスクリプトを実装しました。ここで入手できます: https://github.com/DarwinAwardWinner/screen-sendenv

screen-sendenv.py$PATHに入れた後、.bashrcで次のスニペットを使用できます。

VARS_TO_UPDATE="DISPLAY DBUS_SESSION_BUS_ADDRESS SESSION_MANAGER GPG_AGENT_INFO"
screen_pushenv () {
  screen-sendenv.py -t screen $VARS_TO_UPDATE
}
tmux_pushenv () {
  screen-sendenv.py -t tmux $VARS_TO_UPDATE
}
screen_pullenv () {
  tempfile=$(mktemp -q) && {
    for var in $VARS_TO_UPDATE; do
      screen sh -c "echo export $var=\$$var >> \"$tempfile\""
    done
    . "$tempfile"
    rm -f "$tempfile"
  }
}
tmux_pullenv () {
  for var in $VARS_TO_UPDATE; do
    expr="$(tmux showenv | grep "^$var=")"
    if [ -n "$expr" ]; then
      export "$expr"
    fi
  done
}

これを使用するには、screen_pushenvを実行する前にscreen -rを実行して、画面セッションに再接続します。次に、screen -rでアタッチした後、screen_pullenvで既存のシェルの環境を更新できます。 tmux関数は、screenに似た別のターミナルマルチプレクサであるtmuxに対して同じことを実行します。

2

古い環境を継承するため、screenセッションからシェルスクリプトを開始することはできません。ただし、FIFOを使用して、新しい環境変数を古い画面セッションに取り込むことができます。グラフィカルセッションを開始すると、そのFIFOを埋めることができます。

#!/bin/bash
FIFO=/tmp/your_variables
[ -e $FIFO ] && cat $FIFO > /dev/null || mkfifo $FIFO

# save number of variables that follow
NVARS=2
echo $NVARS > $FIFO
echo ENV1=sth1 > $FIFO
echo ENV2=sth2 > $FIFO

ログイン時にバックグラウンドでそのスクリプトを開始します(すべての変数がスクリプトから読み取られた場合にのみ終了します)。

これで、FIFOから読み取ることができます。この関数を.bashrcに追加します

update_session() {
  FIFO=/tmp/your_variables

  NVAR=$(cat $FIFO)
  for i in $(seq $NVAR); do
    export $(cat $FIFO)
  done
  #delete the pipe, or it will not work next time 
  rm $FIFO
}

古いscreenセッションでできるように

update_session
8

次のコマンドを使用すると、setenvコマンドを呼び出して、画面プロセスの環境変数をインタラクティブに変更できます。 Ctrl-A+ :setenv(画面コマンドを入力するには:文字に注意してください。)環境変数の名前と値の入力を求められます。

(他の回答/コメントに従って)これは(親)画面プロセスに影響し、したがって新しく作成された画面セッションに影響しますが、現在の画面セッションや既存の画面セッションには影響しないことに注意してください。

必要に応じて、環境変数の名前と値を同時に指定できます。 Ctrl-A+ :setenv DISPLAY :100。新しい画面セッションの場合、DISPLAYを「:100」に設定します。

環境変数を削除するには、「unsetenv」を使用できます-例: Ctrl-A+ :unsetenv DISPLAY

2
Mr Weasel

これはおそらくより簡単な解決策です(あなたが決める)。重要な部分は、savedisplayコマンドが実行されるたびにscreen関数を呼び出すエイリアスです。コマンドは自動的に実行されないため、~/.bashrcのような非常に専門的なものの代わりに~/.ssh/rc

savedisplay() {
    # Write latest bash display to a file, This is used to 
    # update running bash sessions for a "screen -r"
    echo "export DISPLAY=$DISPLAY" > ~/.XDISPLAY
    echo "export XAUTHORITY=$XAUTHORITY" >> ~/.XDISPLAY
    # This will only update the environment for new windows
    screen -X setenv DISPLAY $DISPLAY
    screen -X setenv XAUTHORITY $XAUTHORITY
}

# run this to update env variable in a running session
updatedisplay() {
    source ~/.XDISPLAY 
}

alias screen='savedisplay && screen'
0
wecac