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

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

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

나는 본 적이이 스레드. 하지만 하드코딩 검사가 불편해 일반적인 해결책을 찾고 있습니다.

이런 생각을 해봤어매우더러운 해킹이지만 이것이 어떻게 작동할지 잘 모르겠습니다.

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

당신의 경험적 방법은 끔찍합니다. 내 데비안 컴퓨터에서 그들이 찾은 내용은 다음과 같습니다(정확한 히트 항목을 수동으로 표시했습니다 +).

/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명령 및 해당 매개변수에 대한 모든 후속 명령줄 인수를 사용하고 이를 셸 확장하지 않는 X -T터미널 에뮬레이터에서 지원되도록 보장됩니다 . 일부 에뮬레이터는 다르게 동작하기 때문에 때때로 xterm과 더 유사한 구문을 채택하는 래퍼가 있습니다( 이는 이에 대한 두 가지 예입니다).-e-ex-terminal-emulatorgnome-terminal.wrapperxfce4-terminal.wrapper

나는 다른 UNIX 변종과 비슷한 상황을 알지 못합니다. 이식성과 같은 경우 하드코드된 프로그램 이름 목록이 가장 좋습니다.

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

사용자 선호도에 대한 사실상의 표준은 다음과 같습니다.무료 데스크탑 네트워크사양. 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

관련 정보