터미널 에뮬레이터가 데스크탑 세션에서 실행 중인지 스크립트가 감지하도록하는 방법은 무엇입니까?


10

텍스트 파일을 작성한 다음 편집기에서 여는 스크립트가 있습니다. 데스크탑 세션에서 터미널 에뮬레이터 창을 열고 스크립트를 실행하면 편집기가와 같은 그래픽이되고 싶습니다 gedit. 그러나 내 휴대폰 또는 이와 유사한 (데스크톱 세션 없음) ConnectBot를 통해 로그인 한 경우 편집기를 사용하고 싶습니다 nano.

현재 마지막 단계를 제외하고 동일한 두 가지 스크립트를 유지해야합니다 (또는 그래픽을 실행하고 오류를 일으킨 다음 파일을 수동으로 열어야합니다 nano). 대부분 동일한 스크립트를 갖는 것은 유지 관리 측면에서 비효율적입니다.

스크립트가 내가 처한 상황을 감지하고 올바른 편집기를 열 수 있습니까?

(스크립트가 터미널 에뮬레이터 창에서 실행 중인지 또는 두 번 클릭하여 감지 할 수있는 방법을 찾았지만 아직 창에서 데스크탑에서 실행 중인지를 감지하는 방법을 찾지 못했습니다 ... Google에 올바른 용어를 알고 있어야합니다.)


6
스크립트를 다른 사람이 사용하는 경우 $EDITOR기본적으로 지정된 프로그램을 대신 사용하고 설정되지 않은 경우 nano대체 프로그램을 사용해야합니다 nano.
Bakuriu

고마워, 훌륭한 조언, 그리고 좋은 연습을 듣는 것이 좋습니다. 그래도 나만
유기농 대리석

답변:


13

환경 변수 $DISPLAYif조건 내에서 트리거로 사용할 수 있습니다 . 일반적으로이 변수에 값이 있으면 그래픽 응용 프로그램을 실행할 수 있습니다.

예제 는 다음과 같습니다 .

if [[ -z $DISPLAY ]]
then
    nano
else
    gedit
fi

-zenvvar $DISPLAY가 비어 있고 스크립트가 실행될 경우 연산자 는 true를 반환 nano하고 다른 모든 경우에는 실행 gedit됩니다.


@ vurp0 의이 의견에 따르면 :

Fedora 및 Ubuntu의 기본 데스크톱과 같은 대부분의 최신 Wayland 데스크톱 $DISPLAY에서는 여전히 이전 버전과의 호환성 (XWayland를 통한)으로 인해 설정되어 있지만보다 강력한 스크립트의 경우 두 가지 모두를 테스트 $DISPLAY하고 $WAYLAND_DISPLAY확인하는 것이 좋습니다.

다음과 같은 방법으로 테스트 표현식을 수정하는 것이 좋습니다.

[[ -z ${DISPLAY}${WAYLAND_DISPLAY} ]]

따라서 두 변수의 값은 공통 문자열로 연결되어 연산자에 의해 처리됩니다 -z.


참고 문헌 :


1
또는 명시 적 논리의 경우 :[[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]]
추후 공지가있을 때까지 일시 중지되었습니다.

7

일반적으로 가상 터미널은 /dev/pts의사 터미널을 사용 합니다. 따라서 tty명령 출력을 기반으로 case특정 편집기 열기를 처리 하는 간단한 명령문을 작성할 수 있습니다 .

case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac

또는 더 멋지게 포맷하십시오.

case "$(tty)" in
    "/dev/pts"*) gedit ;; 
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
esac

환경 변수를 사용하는 것과 비교할 때 이것은 약간 더 안정적이며 명령이 약간 더 이식 가능한 case명령문을 사용하는 것을 고려합니다 tty. 아마도 가장 좋은 것은 다음과 같은 추가 테스트와 두 가지를 결합하는 것입니다."/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;


이것은 잘못된 방법이 아닙니까? 내 Ctrl + Alt + F1 콘솔에서 tty제공 /dev/tty1하지만 gnome-terminal(첫 번째 탭) 제공합니다 /dev/pts/0.
Paddy Landau

@PaddyLandau 예 gedit에 있어야 /dev/pts*하는 경우. tty에서 오류 테스트를하는 동안 그것들을 바꿨고 다시 전환하지 않고 여기에 복사했습니다. 감사합니다, 이미 편집했습니다.
Sergiy Kolodyazhnyy

3

이것이 내가 사용한 것입니다 :

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

이 코드의 이유는 다음과 같은 질문이었습니다. Bash 스크립트에 대한 바탕 화면 바로 가기 충돌 및 화상

다음과 같이 수정할 수 있습니다.

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    nano ...
else
    gedit ...
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.