새로운 그래픽 로그인을 반영하기 위해 스크린 세션 환경 변수를 업데이트 하시겠습니까?


20

나는 리눅스를 사용하고 단일 화면 세션 내에서 모든 명령 줄 작업을 수행하여 터미널을 잃지 않고 그래픽 로그인을 다시 시작할 수 있습니다. 그러나 그래픽 세션에서 로그 아웃했다가 다시 로그인하면 DBus 세션과 같은 모든 세션 환경 변수가 변경됩니다. 다시 로그인 한 후 화면 세션에 이전 환경 변수가 잘못되었습니다. 이제 화면 세션에서 그래픽 프로그램을 시작하려고 할 때 기껏해야 세션 버스에 연결할 수 없다는 경고가 표시됩니다. 최악의 경우, 그들은 완전히 시작되지 않습니다.

따라서 내가 찾고있는 것은 실행중인 화면 인스턴스에서 환경 변수를 수정하여 이후에 생성 된 모든 화면 창에서 새 환경 변수를 상속하는 방법입니다. 이것을 할 수있는 방법이 있습니까?


3
아하! 방금 전체 화면 맨 페이지를 통해 이것을 찾아 setenv [var [string]] Set the environment variable var to value string. If only var is specified, the user will be prompted to enter a value. If no parameters are specified, the user will be prompted for both variable and value. The environment is inherited by all subsequently forked shells.
Ryan C. Thompson

-X switch to screen을 사용하여 setenv를 호출 할 수 있습니다. 아아, 그것은 현재 껍질이 아닌 이후의 모든 포크 껍질에서만 작동합니다.
보리스 부크

참고 것을 byobu는 이제 스크린과 TMUX 모두 이것에 대한 솔루션을 통합합니다.
Ryan C. Thompson

답변:


8

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

윈도우의 메인 쉘을 수정하기 위해 실행중인 세션에서 윈도우 당 한 번이 작업을 수행하지 않아도됩니까?
quack quixote

~ quack가 말했듯이 각 쉘을 독립적으로 업데이트해야합니다.
dmckee

맞습니다 screen.의 각 쉘에서 그렇게해야합니다 . AFAIK screen는 외부에서 실행중인 세션과 통신하기 위해 소켓이나 이와 유사한 것을 노출시키지 않습니다.
Benjamin Bannier

@dmckee 그러나 모든 새로운 screen 세션은 이미 최근 환경 변수를 가지고 있습니다
Benjamin Bannier

나는이 답변을 지금 수락하기로 결정했습니다. 실제로 이것을 구현하는 데 익숙해지면 업데이트 할 것입니다. 그러나 현재로서는 이론적으로 가능하다는 것을 알고 따뜻한 느낌을 갖는 것만으로 충분합니다.
Ryan C. Thompson

2

이를 위해 스크립트를 구현했습니다. 여기에서 얻을 수 있습니다 : 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 기능은 화면과 유사한 또 다른 터미널 멀티플렉서 인 tmux와 동일한 기능을 수행합니다.


와우 라이언, 그것은 많은 코드입니다. 이전에 받아 들여진 대답에 무엇이 잘못 되었습니까?
Benjamin Bannier

1
글쎄, 화면 (및 tmux)에는 화면의 현재 창에있는 쉘이 아니라 화면 자체에 대한 환경 변수를 설정하는 "setenv"명령이 있음을 발견했습니다. 즉, 내 스크립트를 사용한 후에는 해당 화면 세션에서 새로 생성 된 모든 창에서 업데이트 스크립트를 실행할 필요없이 자동으로 새 환경을 얻게됩니다. 물론 업데이트 스크립트는 기존 셸을 업데이트하는 데 여전히 유용 할 수 있지만 FIFO에서 읽지 않고 화면 / tmux 세션 자체에 새 값을 쿼리하기 위해 다시 작성해야합니다.
Ryan C. Thompson

당신은 화면 / TMUX 세션에서 현재 쉘에 변수를 당겨하는 방법을 볼 수 있습니다 여기 에, screen_updatetmux_update기능. 나는 byobu 독립 버전으로 답변을 업데이트 할 것입니다.
Ryan C. Thompson

1
어쨌든, 무엇이 잘못되었는지에 대한 귀하의 질문에 직접 대답하기 위해 귀하의 답변은 그 질문에 대한 답변이 아니라 오히려 관련 질문에 대한 답변입니다. 스크린 세션 내에서 실행되는 셸 내에서 환경 변수를 업데이트하는 방법을 보여 주지만 스크린 세션 자체에서 환경 변수를 업데이트하는 방법 (새로 생성 된 창이 새 값을 상속하도록하는 방법)은 보여주지 않습니다. 나는 여전히 좋은 솔루션이기 때문에 시간에 그것을 받아,하지만 난 항상 의도했던 결국 내 질문에 진짜 대답을 구현 요청으로 . 따라서 개인적인 것은 없습니다.
Ryan C. Thompson

라이언, 대답 해줘서 고마워 당신이 언급했듯이 setenv이것이 어떻게 더 나은지 봅니다. 연결된 코드에서 명확하지 않았습니다. 다시 감사합니다!
Benjamin Bannier

2

다음 setenv을 사용하여 대화식으로 화면 프로세스에서 환경 변수를 변경 하는 명령을 호출 할 수 있습니다 Ctrl.- A+ :setenv( :화면 명령을 입력 할 문자를 참고하십시오 .) 환경 변수 이름 및 값을 입력하라는 프롬프트가 표시됩니다.

(다른 답변 / 설명에 따라) 이것은 (부모) 화면 프로세스와 새로 만든 화면 세션에 영향을 주지만 현재 화면 세션이나 기존 화면 세션에는 영향을 미치지 않습니다.

원하는 경우 환경 변수 이름과 값을 동시에 지정할 수 있습니다 Ctrl.- A+ :setenv DISPLAY :100. 새 화면 세션에서는 DISPLAY를 ": 100"으로 설정합니다.

환경 변수를 제거하려면 'unsetenv'를 사용할 수 있습니다-예를 들어 Ctrl- A+:unsetenv DISPLAY


0

이것은 아마도 더 간단한 해결책 일 것입니다 (당신이 결정). 중요한 부분은 명령이 실행될 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'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.