
pstree
나는 다음과 유사한 것을 사용하여 쉘 스크립트를 실행하는 상위 에뮬레이터의 이름을 찾는 데 사용했습니다 .
pstree -s $PPID | awk -F '---' '{print $6}'
이것은 현재 시스템에서 작동합니다. mate-terminal
테스트 했지만 xterm
이것이 다른 Linux 시스템/플랫폼 및 기타 터미널에서 작동하는지 확실하지 않습니다. 이를 달성하는 더 나은/더 깔끔한(보다 이식 가능한 방법) 방법이 있습니까?
답변1
ps -o comm= -p "$(($(ps -o ppid= -p "$(($(ps -o sid= -p "$$")))")))"
좋은 결과를 줄 수도 있습니다. 세션 리더의 상위 프로세스 이름을 제공합니다. 터미널 에뮬레이터 내에서 시작된 프로세스의 경우 일반적으로 해당 터미널 에뮬레이터를 실행하는 프로세스가 됩니다( screen
, expect
, tmux
... 등이 사용되지 않는 한(단, screen
및tmux
~이다setsid
터미널 에뮬레이터) 또는 새 세션이 , start-stop-daemon
...) 을 사용하여 명시적으로 시작됩니다.
또는 변수를 사용하여 개별 단계로 세분화합니다(이는 스크립트를 더 자명하게 만드는 데 도움이 될 수도 있음).
sid=$(ps -o sid= -p "$$")
sid_as_integer=$((sid)) # strips blanks if any
session_leader_parent=$(ps -o ppid= -p "$sid_as_integer")
session_leader_parent_as_integer=$((session_leader_parent))
emulator=$(ps -o comm= -p "$session_leader_parent_as_integer")
여기서 숫자 주변의 공백 제거는 $((...))
산술 확장을 사용하여 수행됩니다. 또한 분할+glob 연산자(수정되지 않은 것으로 가정 $IFS
)를 사용하거나 다음을 사용하여 주석에서 @ack가 제안한 대로 수행할 수도 있습니다 xargs
.
ps -o sid= -p "$$" |
xargs ps -o ppid= -p |
xargs ps -o comm= -p
wtmp
터미널 에뮬레이터가 일반적으로 의사 터미널 장치와 연결된 해당 pid를 사용하여 항목을 기록하는 위치를 구문 분석해 볼 수도 있습니다 . 이것은 Expect/screen/tmux...가 포함되지 않은 Debian 시스템에서 작동합니다.
ps -o comm= -p "$(
dump-utmp -r /var/log/wtmp |
awk -v tty="$(ps -o tty= -p "$$")" -F ' *\\| *' '
$2 == tty {print $5;exit}')"
( dump-utmp
GNU에서 사용 acct
).
답변2
현재 셸에서 사용되는 터미널 에뮬레이터의 이름을 찾으려면 X 윈도우 시스템에 현재 셸이 표시되는 창의 이름을 요청하면 됩니다.
$ xwininfo -id $WINDOWID | awk '/^xwin/ { print $NF }'
"xterm"
이는 XTerm과 "urxvt"
Rxvt-unicode에서 실행할 때 문자열을 반환합니다 . 창 제목을 바꾸는 습관이 있다면 결과는 아마도 다를 것입니다. 왜냐하면 그것이 여기에서 여러분에게 다시 전달되는 것이기 때문입니다.
답변3
구축스테판 차젤라스tmux에서 작동하도록 하는 솔루션(즉, tmux 클라이언트가 표시를 위해 사용하는 터미널 에뮬레이터를 반환), 이것은 나에게 적합한 것 같습니다:
TERMINAL_EMULATOR="$(ps --pid $(ps --pid $$ -o ppid=) -o comm=)"
if [[ "${TERMINAL_EMULATOR}" =~ tmux ]]; then
export TERMINAL_EMULATOR=$(ps --pid "$(($(ps --pid $(ps --pid $(tmux display-message -p "#{client_pid}") -o sid=) -o ppid=)))" -o comm=)
else
export TERMINAL_EMULATOR
fi