명령 행에서 현재 터미널의 이름을 얻으려면 어떻게해야합니까?


25

명령으로 터미널 유형을 얻을 수 있습니까?

를 사용하는 경우 gnome-terminal출력은 gnome-terminal비슷하거나 비슷 해야합니다 . 터미널 버전을 얻는 것도 좋을 것입니다.

최신 정보

ps -aux | grep `ps -p $$ -o ppid=` 

다음과 같이 출력됩니다 :

user     4239  0.0  0.7 292708 15744 pts/8    Sl   11:39   0:02 xfce4-terminal
user     4800  0.0  0.0   6176   820 pts/0    S+   12:23   0:00 grep --color=auto  4239

이것은 xterm에서도 작동하지만 이름 ( xfce4-terminal이 경우) 만 어떻게 얻 습니까?


방금 다른 더 나은 접근 방식으로 답변을 업데이트했습니다. 당신은 시간이 있다면, 그것을보고 그것이 또한 당신을 위해 작동하는지 알려주세요.
terdon 2018 년

감사하지만 rxvt의 첫 번째 문제-> window 31457282 has no pid associated with it(루 분투에서 테스트)
TuKsn

오? 젠장, 이상해 시나몬에서 테스트했습니다.
terdon 2018 년

답변:


29

원본 버전

이를 수행하는 한 가지 방법은 현재 쉘 세션의 상위 프로세스를 확보하고 터미널 이름을 얻는 것입니다.

  1. 현재 쉘 프로세스의 부모를 가져옵니다. bash 변수 $$는 현재 쉘의 PID이므로 ps( -p $$)에 쿼리로 부모 프로세스의 PID를 tp 인쇄하도록 요청할 수 있습니다 ( -o ppid=, 후행 =은 열 헤더 인쇄를 피하는 것입니다).

    $ ps -p $$ -o ppid=
    544
    

    따라서 내 쉘 부모의 PID는 544입니다.

  2. 해당 PID와 연관된 프로세스를 가져 와서 해당 명령 행을 인쇄하십시오.

    $ ps -p 544 o args=
    /usr/bin/python /usr/bin/terminator
    

    위의 출력은 사용중인 터미널 에뮬레이터에 따라 다릅니다 terminator.

  3. 하나의 명령으로 모든 것을 결합

    ps -p $(ps -p $$ -o ppid=) o args=
    
  4. 그것을 사용하여 버전을 얻으십시오

    $(ps -p $(ps -p $$ -o ppid=) o args=) --version
    terminator 0.97
    
  5. ~/.bashrc사용중인 터미널 에뮬레이터의 이름과 버전을 반환 하는 작은 함수를 추가하십시오 (가장 일반적인 터미널 에뮬레이터에서 작동합니다).

    which_term(){
        term=$(ps -p $(ps -p $$ -o ppid=) -o args=);
        found=0;
        case $term in
            *gnome-terminal*)
                found=1
                echo "gnome-terminal " $(dpkg -l gnome-terminal | awk '/^ii/{print $3}')
                ;;
            *lxterminal*)
                found=1
                echo "lxterminal " $(dpkg -l lxterminal | awk '/^ii/{print $3}')
                ;;
            rxvt*)
                found=1
                echo "rxvt " $(dpkg -l rxvt | awk '/^ii/{print $3}')
                ;;
            ## Try and guess for any others
            *)
                for v in '-version' '--version' '-V' '-v'
                do
                    $term "$v" &>/dev/null && eval $term $v && found=1 && break
                done
                ;;
        esac
        ## If none of the version arguments worked, try and get the 
        ## package version
        [ $found -eq 0 ] && echo "$term " $(dpkg -l $term | awk '/^ii/{print $3}')    
    }

    이제 터미널 이름을 얻고 원하는 옵션 (예 :)을 전달할 수 있습니다 --version.

다른 터미널을 사용하는 몇 가지 예 :

  1. xterm

    $ which_term
    XTerm(297)
    
  2. terminator

    $ which_term 
    terminator 0.97
    
  3. rxvt,이 버전 에는 -V, -version또는 --version플래그가 없으므로 버전 정보가 인쇄되지 않습니다.

    $  which_term
    rxvt  1:2.7.10-5
    
  4. gnome-terminal.

    $ which_term
    gnome-terminal  3.10.1-1
    
  5. konsole

    $ which_term
    Qt: 4.8.6
    KDE Development Platform: 4.11.3
    Konsole: 2.11.3
    
  6. lxterminal

    $ which_term
    lxterminal  0.1.11-4
    
  7. xfce4-terminal

    $ which_term
    xfce4-terminal 0.6.2 (Xfce 4.10)
    
    Copyright (c) 2003-2012
        The Xfce development team. All rights reserved.
    
    Written by Benedikt Meurer <benny@xfce.org>
    and Nick Schermer <nick@xfce.org>.
    
    Please report bugs to <http://bugzilla.xfce.org/>.
    

새롭고 개선 된

위의 접근 방식은 신뢰할만한 것은 아닙니다. su다른 사용자에게 연결 한 후 쉘을 실행할 때 또는 터미널이 무언가 다른 다양한 별칭을 가질 때 질식 합니다. 우리는 분명히 X 프로그램을 사용하고 있기 때문에 더 나은 방법은 xdotool(로 설치 가능)과 같은 것을 사용 sudo apt-get install xdotool하여 정보를 얻는 것입니다.

perl -lpe 's/\0/ /g' /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline

위는 현재 활성화 된 창을 시작하는 데 사용되는 명령 줄을 인쇄합니다. 아마도 터미널이 활성화 될 것이므로 그것이 보여줄 명령입니다. 이것은 대부분의 터미널 에뮬레이터에서 반환 된 첫 번째 필드가 터미널 이름이라고 안전하게 가정 할 수 있음을 의미합니다.

$ which_term 
lxterminal 

이것은 버전을 얻는 것이 쉽지 않다는 것을 의미합니다. 예를 들어

$ dpkg -l $(which_term) | awk '/^ii/{print $3}'
0.1.11-4

그렇지 않다 gnome-terminal:

$ which_term 
/usr/lib/gnome-terminal/gnome-terminal-server 

또는 terminator:

$ which_term
/usr/bin/python /usr/bin/terminator 

그래서 우리는 좀 더 복잡하게 만들 수 있습니다 (여기에는 bashism이 있습니다. 이것은 이식성이 없습니다).

which_term(){
    term=$(perl -lpe 's/\0/ /g' \
           /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline)

    ## Enable extended globbing patterns
    shopt -s extglob
    case $term in
        ## If this terminal is a python or perl program,
        ## then the emulator's name is likely the second 
        ## part of it
        */python*|*/perl*    )
         term=$(basename "$(readlink -f $(echo "$term" | cut -d ' ' -f 2))")
         version=$(dpkg -l "$term" | awk '/^ii/{print $3}')
         ;;
        ## The special case of gnome-terminal
        *gnome-terminal-server* )
          term="gnome-terminal"
        ;;
        ## For other cases, just take the 1st
        ## field of $term
        * )
          term=${term/% */}
        ;;
     esac
     version=$(dpkg -l "$term" | awk '/^ii/{print $3}')
     echo "$term  $version"
}

이것은 내가 테스트 한 모든 경우에 적용됩니다.


@ Xubu-Tur 흠, 다른 터미널에서 수동으로 각 터미널을 시작하여 시도했지만 정상적으로 작동했습니다. 데스크탑 환경 메뉴의 경로가 다르거 나 터미널 시작 방법이 어떻게 다른지 추측합니다. 정확히 어떻게 시작했는지, 어떤 오류가 발생했는지 알려 주면 더 나은 것을 줄 수 있습니다. 메뉴에서 시작한 경우 메뉴 항목이 실행하는 명령을 확인하십시오.
terdon

@ Xubu-Tur는 스크린 샷을 추가하지 않습니다. 오류 메시지를 질문에 붙여 넣으십시오. 메뉴 항목이 시작하는 모든 명령에 동일합니다. 사진에서 수동으로 복사하지 마십시오!
terdon

2
$PPID부모 프로세스의 PID를 얻는 데 사용할 수 있습니다 .
nyuszika7 시간

@ nyuszika7h 예, 가능하며 +1하지만 그렇지는 않습니다. 방금 확인했는데 ksh또는 에서 사용할 수 없습니다 tcsh. 내 접근 방식보다 훨씬 간단하기 때문에 bash 제품군에는 매우 좋습니다.
terdon

ksh93및 에서 확실히 사용할 수 있습니다 mksh.
nyuszika7 시간

8

이 시도,

ps -aux | grep `ps -p $$ -o ppid=` | awk 'NR==1{print $11}'

또는

ps -aux | grep `ps -p $$ -o ppid=` | awk 'NR==1{print $NF}'

첫 번째는 실패 rxvt하고 terminator두 번째는 실패 uxterm하고 gnome-terminal(그것은 출력 /usr/lib/gnome-terminal/gnome-terminal-server). su 세션을 사용하면 모두 실패합니다.
terdon 2018 년

7
basename "$(cat "/proc/$PPID/comm")"

$PPID쉘 상위 프로세스의 PID입니다. 명령을comm 의미 합니다. 전체 경로 일 수도 있고 아닐 수도 있으므로 필요한 경우 경로를 제거하는 데 사용합니다.basename

경고

이것은 아마도 다른 답변 중 적어도 일부에도 적용됩니다.

  • comm기술적으로 argv[0]실제로 임의의 문자열이 될 수있다. 그러나 일반적으로이 특정한 경우에 의존 할 수 있어야합니다.

  • SSH를 통해 연결하거나 tmux, screen또는 이와 유사한 것을 사용하면 예상대로 작동하지 않습니다 .


이것은 매우 좋은 +1이지만 터미네이터 터미널 termin에서는 출력으로 만 얻습니다 .
TuKsn

이유를 모르겠습니다. 아마도 터미네이터의 잘못 일 것입니다.
nyuszika7h

그것은 내가 생각하는 파이썬 스크립트로 실행되기 때문입니다. 정말 성가시다.
terdon 2018 년

그주의 $PPID모든 셸의 표준이 아니다. 예를 들면 다음과 tcsh같습니다.PPID: Undefined variable.
arielf

2

다음 명령을 시도 할 수 있습니다.

$ dpkg-query -W $COLORTERM
gnome-terminal  3.6.2-0ubuntu1

업데이트 (OP 및 Avinash Raj 덕분에) :

$ dpkg-query -W $(ps -aux | grep "`ps -p $$ -o ppid=`" | awk 'NR==1{print $11}' | xargs basename)
rxvt    1:2.7.10-5

나는 그가 ... 그 시간에 "퍼티"를 사용하는 경우 그 :) 그래서 활성 터미널 세션을 위해 그것을 알고 싶어 생각
Rinzwind

"퍼티"는 아니지만 gnome-terminal 3.6.2-0ubuntu1lxterm은 무엇입니까? 이 명령을 사용하면 xterm 에도 나타납니다 .
TuKsn

2
현재 사용중인 터미널은 인쇄되지 않습니다. 기본 $ COLORTERM으로 설정된 모든 것을 인쇄하며, 당시 사용중인 것과는 아무런 관련이 없습니다.
terdon

업데이트는 xterm 과도 잘 작동하며 버전과 이름을 보여줍니다.
TuKsn

모든 크레딧은 @Avinash와 올바른 명령에 당신에게 전달됩니다. 방금 버전을 추가했습니다.
Sylvain Pineau 2016 년

2

또 다른 (완벽하지 않은) 가능성은 다음과 같습니다.

xprop -id $WINDOWID WM_CLASS | cut -d" " -f3 | sed 's/^.\(.*\)..$/\1/'

그러나 환경 변수가 $WINDOWID비어 있기 때문에 lxterminal에서는 작동하지 않습니다 ...

터미네이터는 "x-terminal-emulator"라는 이름을 보여줍니다.


0

이스케이프 시퀀스를 통해 현재 터미널을 감지 할 수도 있습니다. 장치 속성 (보조 DA)

예를 들어 bash에서 :

read -s -dc -p $'\E[>c' da;da=${da##$'\E'[>};echo "${da//;/ }"

이것은 일종의 id 만 반환합니다. 슬프게도 이것을 실제 이름으로 변환하는 공식 목록을 알지 못합니다.


알려진 일부 ID를 터미널 이름으로 변환하는 실제 구현에 대해서는 다음 bash 스크립트 예를 참조하십시오. https://github.com/mintty/utils/blob/master/terminal

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