bash 스크립트 (.bashrc 등)에서 X 세션 감지


16

최근에 나는 xset b off.bashrc에 넣었다 . 이제 tty 또는 ssh, 즉 X 세션 외부를 통해 로그인 할 때 오류가 발생하여 화가납니다.

내 생각에 가장 먼저 온 것은 [[ -z "$SOME_VAR" ]] && xset b off(테스트 변수가 설정 되는 것과 비어있는 것이 다른 질문 이라는 것이 밝혀졌습니다 ). 그러나 어떤 SOME_VAR이 올바른가요?

그래서 tty의 set출력과 urxvt의 set출력을 비교하여 X에 설정되어 있고 tty에없는 변수를 확인했습니다. 예상대로 많은 차이가있었습니다 (나와 관련이있는 것만 나열).

  • DESKTOP_SESSION
  • DISPLAY
  • GDMSESSION
  • SESSION_MANAGER
  • WINDOWID
  • WINDOWPATH
  • XAUTHORITY
  • XDG_SESSION_COOKIE
  • XDG_CONFIG_DIRS
  • XDG_DATA_DIRS
  • XDG_MENU_PREFIX

내가 X 세션에 있는지 여부를 감지하기 위해 테스트 할 가장 정확하고 보편적 인 것은 어느 것입니까? 가능한 많은 배포판과 플랫폼 및 데스크탑 환경에서 작동하는 것이 있습니까?

아니면 환경 변수를 테스트하는 것보다 더 좋은 방법이 있습니까?

답변:


8

디스플레이 서버가 사용 가능하고 유효한지 테스트하는 간단하고 효과적인 방법은로 테스트하는 것입니다 xhost. DISPLAY변수 의 값을 유효하지 않은 값으로 설정할 수 있기 때문에 항상 값을 확인하지 않아도 됩니다.

if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi

내가하는 이유는 사용자 crontab가 디스플레이에있을 때 작동하는 스크립트를 여러 개 실행 하지만 그렇지 않은 경우 다르게 작동하기 때문입니다. 내 상단 crontab에는 DISPLAY변수 :0가 아직 없더라도 변수를 설정했습니다 . 표시 여부에 관계없이 crontab시작하는 스크립트 @reboot가 시작됩니다. 이를 통해 디스플레이가 동일한 스크립트 내에서 들어오고 나가는 시점을 동적으로 감지 할 수 있습니다.

참고 : > = 4 >&에서만 작동합니다 bash. 그렇지 않으면> /dev/null 2>&1


좋은 테스트 ssh -X; 잘 작동합니다!
Alois Mahdal

13

확인 DISPLAY이 최선의 방법 이라고 생각 합니다.

  • 원격 로그인을 처리합니다 (예 : ssh -X).
  • 모든 플랫폼은 아니지만 대부분의 플랫폼에서 사용할 수 있습니다.
  • 창 관리자 / DE와 무관합니다.

2
또한 DISPLAY오류 메시지를 표시하지 않거나 일반적으로 오류 메시지를 표시하지 않습니다. /dev/null때때로 사랑을 주십시오 .
frostschutz

3
@frostschutz 아니요, 스크립트의 관련 부분 만 실행하려고합니다. 오류 메시지를 표시하지 않아도 해당 방향으로 진행되지 않습니다. 실제로, 잠재적으로 파손될 수있는 다른 문제를 해결하는 데 심각한 혼란을 초래할 수 있습니다.
Alois Mahdal

1
나는 대답 직후에이 방법을 사용하기 시작, 그것은 간단한 완벽하게 일을 ssh지금까지의 나는 일을 시작했을 때 ssh -X그 내용이 시각적 모드로 선택하는 지역의 X 클립 보드에 얻을 수 있도록 SSH를 통해 빔을 사용할 수 있도록 --- 서버 측에 xserver가 필요하지 않습니다 . 따라서 xserver 및 xset이없는 경우에도 단순히 전달을 활성화하는 효과로 DISPLAY가 설정됩니다.
Alois Mahdal


1
귀하의 DISPLAY변수는 (이 스크립트에 하드 코딩, 또는 변수가 설정 한 후 X 서버가 종료되었을 때, 예를 들어) 실제로 X를 실행하는 서버가없는 디스플레이를 가리킬 수 있습니다.
n.st

6

나는 보통 TERM스크립트에서 변수를 사용하여 X를 테스트합니다.

TERM일반적으로 설정 linuxTTY와 xtermX에서
GNU 화면 및 TMUX 같은 응용 프로그램이 엉망으로 보인다 이후, 여기에 "보통"이라는 단어를 사용하는 TERM변수.


시도 echo $TERM다른 콘솔에 mashine에 richt 설정을 찾을 수 있습니다. 내가 사용하는 [ $TERM == "linux" ] && echo do some stuff우분투
rubo77

3

이것은 완벽하게 작동합니다.

[ ! -t 0 ] && xset b off                                  

http://tldp.org/LDP/abs/html/fto.html

-t

    file (descriptor) is associated with a terminal device

    This test option may be used to check whether the stdin [ -t 0 ] 
    or stdout [ -t 1 ] in a given script is a terminal.

따라서 이것이 false ( [ ! -t 0 ])로 평가되면 GUI 환경에 있습니다.


이와 함께, I 즉, 둘 다 X와 콘솔에서 동일한 결과를 얻을 [ -t 0 ]하고 [ -t 1 ]모두 사실입니다.
Emanuel Berg

이상한, 그것은 원격 호스트에 sshing 때 나를 위해 작동합니다.
terdon

[ -t 0 ](CTRL ALT F1 사용) 우분투 콘솔에서 잘 작동
rubo77

0

당신이 할 수있는 방법은 여러 가지가 있습니다.

bash에서 시도하십시오

function xruns {
    if [[ `pstree -As $$ | grep xinit | wc -l` == 1 ]]; then
        echo "You are in X."
    else
        echo "You are not in X."
    fi
}

또는 zsh에서 시도해보십시오

#!/usr/bin/zsh

CURRENT_VT=`tty`

if [[ ${CURRENT_VT[6]} == "p" ]];        # or `${CURRENT_VT:5:1}` in bash
then
   # X stuff
else 
   # non-X stuff      
fi

포인트를 얻었지만 게시하기 전에 코드를 테스트합니까? 첫 번째는 구문 오류 있으며 X 세션에 있는지 실제로 감지하지 않으므로 echo 1X가 실행 중이고 tty1-6 또는 ssh를 통해 로그인하면 발생합니다. 다른 하나는 항상 "X가 아닌 것"을 수행합니다. 저는 ${CURRENT_VT[6]}6 번째 문자보다는 6 번째 줄 을 의미 한다고 생각합니다 .
Alois Mahdal

@ AloisMahdal : Aha, 내 물건은 bash에서 작동하지 않습니다 (zsh를 사용합니다). 그렇게 생각하지 않았습니다. 글쎄, 당신은 zsh (type zsh) 에서 시도하고 원하는 경우 bash에서 작동하도록 수정 할 수 있습니다.
Emanuel Berg

@AloisMahdal : 좋아, 나는 그것을 바꿨다. "tty1-6을 통해 로그인"에 관해서는, 그것이하는 일입니다. 그런 다음 위의 두 번째 솔루션을 사용하고 변수를 설정합니다. 이것을 확인하고을 .zshrc검색하십시오 export VT. 변수를 사용하여 (zsh 프롬프트의 경우) Linux VT / console / tty를 유지하지만 X에서는 VT는 아니지만 "X"로 설정했습니다. 그러나 자세한 내용은 동일한 원리를 사용하여 bash에서 원하는 방식으로 해결할 수 있습니다.
Emanuel Berg

조건의 bash 버전을 두 번째 예에 추가했습니다. 그러나 나는 첫 번째 것이 여전히 잘못되었다고 생각합니다. ps가 조상 만 인쇄 하도록하는 것이 도움이 될 것입니다. 그래도 가능한지 잘 모르겠습니다.
Alois Mahdal

@AloisMahdal : 편집 내용을 확인하십시오. 그것은 tty 물건을 포함하여 나를 위해 그것을합니다.
Emanuel Berg

0

if [[ $DISPLAY ]]

같은 컴퓨터에서 $DISPLAY예를 들어 0:0터미널 에뮬레이터에서 반환 되지만 실제 터미널에서는 반환 되지 않습니다. 이것은 CtrlAltF1vs로 쉽게 테스트 할 수 있습니다 CtrlAltF7.

bash기반 조건을 $DISPLAY다음과 같이 보일 것이다 :

if [[ $DISPLAY ]]; then 
  
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.