설치된 에뮬레이터를 모르고 터미널 에뮬레이터 실행

설치된 에뮬레이터를 모르고 터미널 에뮬레이터 실행

터미널 에뮬레이터를 시작하고 그 안에서 특정 명령을 실행하는 스크립트를 작성해야 합니다. 대상 시스템에 어떤 터미널 에뮬레이터가 설치되어 있는지 모르면 어떤 터미널 에뮬레이터가 설치되어 있는지 어떻게 알 수 있습니까?

나는 보았다이 스레드. 그러나 저는 하드코딩된 검사를 별로 좋아하지 않으며 일반적인 솔루션을 찾고 있습니다.

내가 이걸 생각해냈어매우더러운 해킹이지만 이것이 어떻게 될지 잘 모르겠습니다.

termdetect:

#!/bin/bash

IFS=:
for i in $PATH; do
  find "$i" -type f -exec isterminal {} \;
done

isterminal:

#!/bin/bash

if [[ ! -z "$1" ]]; then
  if [[ "$(head -c 4 "$1")" == $'\x7fELF' ]]; then
    if ! grep editor "$1" > /dev/null; then
      if grep -E '(vte_terminal_|libutempter|rxvt_)' "$1" > /dev/null; then
        echo "$1"
      fi
    fi
  fi
fi

내가 놓친 쉬운 일반적인 솔루션이 있습니까? 아니면 힌트를 찾기 위해 바이너리를 뒤지거나 하드코딩된 목록을 사용하는 것 외에는 다른 방법이 없나요?

답변1

당신의 경험적 방법은 꽤 나쁩니다. 내 Debian wheezy 컴퓨터에서 그들이 찾은 내용은 다음과 같습니다. (나는 수동으로 올바른 히트 항목을 로 표시했습니다 +).

/usr/bin/gcm-calibrate
/usr/bin/gnome-terminal        +
/usr/bin/mosh-client   
/usr/bin/mosh-server
/usr/bin/mrxvt                 +
/usr/bin/mrxvt-full            +
/usr/bin/roxterm               +
/usr/bin/rxvt-unicode          +
/usr/bin/urxvt                 +
/usr/bin/urxvtd
/usr/bin/vinagre
/usr/bin/x-terminal-emulator   +
/usr/bin/xfce4-terminal        +
/usr/bin/xterm                 +

첫 번째 알파벳 일치 항목을 선택하면 색상 교정기입니다.

x-terminal-emulator다음은 이 데비안 머신에서 (배포 관리 프로그램에 관한 한) 정답인 에 대한 대안 목록입니다 :

/usr/bin/Eterm
/usr/bin/gnome-terminal.wrapper
/usr/bin/koi8rxterm
/usr/bin/konsole
/usr/bin/lxterm
/usr/bin/mlterm
/usr/bin/mrxvt-full
/usr/bin/roxterm
/usr/bin/rxvt-xpm
/usr/bin/rxvt-xterm
/usr/bin/urxvt
/usr/bin/uxterm
/usr/bin/xfce4-terminal.wrapper
/usr/bin/xterm
/usr/bin/xvt

15개 중 7개(이름이 다양하기 때문에)를 찾았는데 이는 적중률이 그리 좋지 않습니다.

경험적 방법을 개선하려고 노력할 수도 있지만 이는 끝이 없는 게임입니다. 최소한은 일부 X11 라이브러리에 대해 링크하고 getpt또는 같은 일부 마스터 터미널 기능이나 유틸리티를 호출하는 실행 파일만 유지하는 것입니다 grantpt. 그러나 이는 가짜 긍정도 많이 발견하고 호출이 라이브러리에 있는 실행 파일을 놓칠 수밖에 없습니다( 좋다 konsole). 그리고 이렇게 하면 쉘 래퍼를 통해 액세스되는 기본 코드 실행 파일이 누락됩니다(내 목록에 여러 개가 있음).

실행 가능한 콘텐츠에서 프로그램이 X 터미널 에뮬레이터인지 여부를 감지하는 것은 절망적입니다.

이름으로 프로그램을 탐지하는 것이 훨씬 더 나은 경험적 방법입니다.

또한 프로그램마다 명령줄 구문이 다릅니다. 대부분은 및 을 허용하지만 (셸 통과 여부, 여러 인수 사용 여부) 에 대한 구문 분석 규칙이 다르기 때문에 셸 특수 문자를 포함하지 않고 뒤에 단일 매개변수를 전달해야 합니다.-T TITLE-e COMMAND-e-e

데비안과 파생상품에서는x-terminal-emulator-T은(는) 및 를 지원하는 X 터미널 에뮬레이터 -e이므로 -e모든 후속 명령줄 매개변수를 명령 및 해당 인수로 사용하고 그에 대한 셸 확장을 수행하지 않습니다. 일부 에뮬레이터는 다르게 동작하기 때문에 x-terminal-emulator때때로 xterm과 유사한 구문을 사용하는 래퍼입니다( gnome-terminal.wrapper이는 xfce4-terminal.wrapper이에 대한 두 가지 예입니다).

나는 다른 유닉스 변종에서는 이와 같은 것을 모릅니다. 이식성과 같은 경우 하드 코딩된 프로그램 이름 목록이 가장 좋습니다.

또한 설치된 터미널 에뮬레이터를 감지해도 사용자의 기본 설정에 대한 정보가 제공되지 않습니다. 예를 들어, 제가 Gnome을 사용한다면 여러분의 응용 프로그램이 Konsole을 시작하는 것을 원하지 않을 것입니다. 제가 Konsole을 선호하는 경우가 아닌 이상, 그것을 어떻게 알 수 있습니까?

사용자 선호도에 대한 사실상의 표준은 다음과 같습니다.FreeDesktop.org명세서. Freedesktop은xdg-utils다음과 같은 프로그램이 포함된 패키지xdg-open적절한 응용 프로그램에서 문서를 열려면xdg-email사용자가 선호하는 이메일 작성 응용 프로그램을 시작하는 등의 요점xdg-terminal사용자가 선호하는 터미널 에뮬레이터를 엽니다.

이렇게 하면 사용하기에 적합한 것이 되며 xdg-terminal, 거기에 있으면 사용해야 합니다. 불행히도 xdg-terminal모든 곳에서 사용할 수는 없습니다. 예를 들어 데비안은 이를 제공하지 않습니다.오랫동안 방치된 버그). 뿐만 아니라xdg-terminal단일 명령 인수를 허용하며 이 인수가 어떤 종류의 확장을 겪는지에 대해 일관성이 없습니다.

무엇을 하든지 호출자가 기본 설정을 지정할 수 있는 쉬운 방법을 제공해야 합니다. 심지어 xdg-terminal항상 옳은 것도 아닙니다.

따라서 최선의 전략은 다음과 같습니다.

  1. 사용자가 기본 설정을 지정한 경우 이를 사용하십시오.
  2. 아니면 시도해 보세요xdg-terminal
  3. 아니면 시도해 보세요x-terminal-emulator
  4. 그렇지 않으면 하드 코딩된 목록을 사용해 보세요.

답변2

Debian 및 파생 제품(Ubuntu, Mint 등)에서는 x-terminal-emulator항상 관리자의 기본 그래픽 터미널을 시작합니다.
그래픽 세션인지 확인하기 위해 다음과 같은 것을 포함할 수도 있습니다.

if [ -z "$XAUTHORITY" ]
then 
 echo "Failed to launch terminal emulator! This is not a graphical session."
else
 x-terminal-emulator
fi

관련 정보