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")
여기서 숫자 주위의 공백 제거는 $((...))
산술 확장을 사용하여 수행됩니다. 또한 Split+glob 연산자(수정 사항이 없다고 가정 $IFS
)를 사용하거나 주석에서 제안된 @ack를 사용할 수도 있습니다 xargs
.
ps -o sid= -p "$$" |
xargs ps -o ppid= -p |
xargs ps -o comm= -p
또한 wtmp
일반적으로 터미널 에뮬레이터에 의해 기록된 항목과 의사 터미널 장치를 사용하는 관련 PID를 구문 분석해 볼 수도 있습니다. 예상/화면/tmux...가 관련되지 않은 경우 데비안 시스템에서 작동합니다.
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 Window System에 현재 셸에 표시되는 창 이름을 문의하세요.
$ xwininfo -id $WINDOWID | awk '/^xwin/ { print $NF }'
Rxvt-unicode에서 실행하면 "xterm"
XTerm에 문자열이 반환됩니다 . "urxvt"
창 제목을 변경하는 습관이 있는 경우 결과가 다를 수 있습니다. 여기서 반환되는 내용이 바로 이것이라고 가정합니다.
답변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