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

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

최근에 나는 xset b off.bashrc에 넣었습니다. 이제 tty나 ssh를 통해, 즉 X 세션 외부에서 로그인할 때 나타나는 오류 때문에 짜증이 납니다.

내 마음 속에 가장 먼저 떠오른 것은 [[ -z "$SOME_VAR" ]] && xset b off(글쎄, 알고 보니 그 테스트는변수가 설정되는 것과 비어 있는 것다른 질문입니다.) 하지만 어떤 SOME_VAR이 올바른가요?

그래서 어떤 변수가 X에 설정되어 있고 tty에서 누락되었는지 확인하기 위해 tty의 set출력과 urxvt의 출력을 비교했습니다 . set예상한 대로 꽤 많은 차이점이 있었습니다(나에게 관련이 있다고 생각되는 차이점만 나열).

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

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

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

답변1

디스플레이 서버가 사용 가능하고 유효한지 테스트하는 간단하고 효과적인 방법은 xhost. DISPLAY변수가 잘못된 값으로 설정될 수 있으므로 항상 변수의 값을 확인하는 데 의존할 수는 없습니다 .

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

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

참고: >= 4 >&에서만 작동합니다 . 그렇지 않으면 다음을 사용하십시오.bash> /dev/null 2>&1

답변2

DISPLAY확인하는 것이 가장 좋은 방법이라고 생각합니다 .

  • 원격 로그인(예: ssh -X)을 처리합니다.
  • 전부는 아니더라도 대부분의 플랫폼에서 사용할 수 있습니다.
  • 창 관리자/DE와 독립적입니다.

답변3

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

TERMlinux일반적 으로 TTY 및 xtermX 에서 설정됩니다.
GNU Screen 및 TMux와 같은 응용 프로그램이 변수를 엉망으로 만드는 것처럼 보이기 때문에 여기서는 "보통"이라는 단어를 사용합니다 TERM.

답변4

일반 bash 스크립트에서는:if [[ $DISPLAY ]]

동일한 컴퓨터에서 $DISPLAY예를 들어 터미널 에뮬레이터에서는 반환되지만 0:0실제 터미널에서는 아무것도 반환되지 않습니다. 이는 CtrlAltF1vs. 를 사용하여 쉽게 테스트할 수 있습니다 CtrlAltF7.

bash기반 조건은 다음 $DISPLAY과 같습니다.

if [[ $DISPLAY ]]; then 
fi

또는 :.profile.personalif xhost >& /dev/null

내 경험에 따르면 , 또는 확장하여 실행될 $DISPLAY시기가 아직 설정되지 않았습니다 . 그러한 경우에는.profile.personal사용자가 답변 cmevoli가장 좋은 서비스:

if xhost >& /dev/null; then
fi

데스크탑을 정의할 때 이 문제가 발생했습니다.CapsLock 키 매핑그것은 내 서버에 적용되어서는 안 됩니다.

관련 정보