명령으로 터미널 유형을 얻을 수 있습니까?
를 사용하는 경우 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
이 경우) 만 어떻게 얻 습니까?
답변
원본 버전
이를 수행하는 한 가지 방법은 현재 쉘 세션의 상위 프로세스를 확보하고 터미널 이름을 얻는 것입니다.
-
현재 쉘 프로세스의 부모를 가져옵니다. bash 변수
$$
는 현재 쉘의 PID이므로ps
(-p $$
)에 쿼리로 부모 프로세스의 PID를 tp 인쇄하도록 요청할 수 있습니다 (-o ppid=
, 후행=
은 열 헤더 인쇄를 피하는 것입니다).$ ps -p $$ -o ppid= 544
따라서 내 쉘 부모의 PID는
544
입니다. -
해당 PID와 연관된 프로세스를 가져 와서 해당 명령 행을 인쇄하십시오.
$ ps -p 544 o args= /usr/bin/python /usr/bin/terminator
위의 출력은 사용중인 터미널 에뮬레이터에 따라 다릅니다
terminator
. -
하나의 명령으로 모든 것을 결합
ps -p $(ps -p $$ -o ppid=) o args=
-
그것을 사용하여 버전을 얻으십시오
$(ps -p $(ps -p $$ -o ppid=) o args=) --version terminator 0.97
-
~/.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
.
다른 터미널을 사용하는 몇 가지 예 :
-
xterm
$ which_term XTerm(297)
-
terminator
$ which_term terminator 0.97
-
rxvt
,이 버전 에는-V
,-version
또는--version
플래그가 없으므로 버전 정보가 인쇄되지 않습니다.$ which_term rxvt 1:2.7.10-5
-
gnome-terminal
.$ which_term gnome-terminal 3.10.1-1
-
konsole
$ which_term Qt: 4.8.6 KDE Development Platform: 4.11.3 Konsole: 2.11.3
-
lxterminal
$ which_term lxterminal 0.1.11-4
-
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"
}
이것은 내가 테스트 한 모든 경우에 적용됩니다.
답변
이 시도,
ps -aux | grep `ps -p $$ -o ppid=` | awk 'NR==1{print $11}'
또는
ps -aux | grep `ps -p $$ -o ppid=` | awk 'NR==1{print $NF}'
답변
basename "$(cat "/proc/$PPID/comm")"
$PPID
쉘 상위 프로세스의 PID입니다. 명령을comm
의미 합니다. 전체 경로 일 수도 있고 아닐 수도 있으므로 필요한 경우 경로를 제거하는 데 사용합니다.basename
경고
이것은 아마도 다른 답변 중 적어도 일부에도 적용됩니다.
-
comm
기술적으로argv[0]
실제로 임의의 문자열이 될 수있다. 그러나 일반적으로이 특정한 경우에 의존 할 수 있어야합니다. -
SSH를 통해 연결하거나
tmux
,screen
또는 이와 유사한 것을 사용하면 예상대로 작동하지 않습니다 .
답변
다음 명령을 시도 할 수 있습니다.
$ 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
답변
또 다른 (완벽하지 않은) 가능성은 다음과 같습니다.
xprop -id $WINDOWID WM_CLASS | cut -d" " -f3 | sed 's/^.\(.*\)..$/\1/'
그러나 환경 변수가 $WINDOWID
비어 있기 때문에 lxterminal에서는 작동하지 않습니다 …
터미네이터는 “x-terminal-emulator”라는 이름을 보여줍니다.
답변
이스케이프 시퀀스를 통해 현재 터미널을 감지 할 수도 있습니다. 장치 속성 (보조 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