그리고 " "라고 말하지 마세요 $TERM
. 항상 입니다 xterm
.
bash
스크립트는 실행 중인 터미널, 특히 iTerm, Terminal.app 또는 실제로 xterm인지 어떻게 알 수 있습니까 ?
reset
Terminal.app 및 iTerm2에서는 기본적으로 작동하지 않기 때문에 묻습니다 . 그러나 iTerm2는 터미널 재설정( )을 수행하기 위한 이스케이프 시퀀스를 인식하며 \x1b]50;ClearScrollback\x07
, 이를 감지할 수 있으면 reset
올바른 작업을 수행하는 별칭으로 재정의할 수 있습니다. AFAICT, Terminal.app에는 재설정 시퀀스가 없으며사람들은 그 문제를 해결하기 위해 터무니없는 톰 해커리(Tom-Hackery)에 의지합니다..
여기서 나의 최종 목표는 reset
OS X에서 작업하든 Linux에서 작업하든, 로컬에서 작업하든 SSH를 통해 원격으로 작업하든 동일한 작업을 수행하는 것입니다. (어느 것을 기억하려고 노력할 필요가 없으며 reset && command-that-outputs-a-bunch
작업을 수행하고 입력하는 것이 유용합니다.) Terminal.app과 iTerm은 reset
올바르게 구현하지 않음으로써 이 계획에 렌치를 던지고 있습니다.
이는 단순히 재정의하는 것이 전부가 아니라는 것을 의미합니다 . Linux 시스템을 사용하는 경우 올바른 이스케이프 시퀀스를 보내기 위해 reset
내가 사용하고 있는지 iTerm을 사용하고 있는지 알아야 합니다 .gnome-terminal
(이 필요하더라도 ioctl
) 터미널에 무엇인지 물어볼 수 있는 방법이 있나요?정말이다?
¹이 질문의 목적에 따라 재설정은 화면을 지우고 커서를 재설정하고 스크롤백 버퍼를 지워야 합니다.
답변1
사용 $TERM_PROGRAM
.
iTerm은 로 설정 iTerm.app
하고 Terminal.app은 으로 설정합니다 Apple_Terminal
.
답변2
$TERM
현재 실행 중인 터미널 에뮬레이터와 전혀 관련이 없으며 기본 터미널일 뿐이며 무엇이든 설정할 수 있습니다. 실행 중인 터미널 에뮬레이터의 이름을 얻으려면 ps
현재 셸의 상위 프로세스 PID를 얻는 데 사용할 수 있습니다 .
참고: 다음은 OSX에서는 실패하지만 Linux에서는 제대로 작동합니다.
현재 쉘 프로세스의 PID는 입니다 $$
. 여기에서 ps
프로세스 트리를 표시하고 현재 쉘 세션의 상위 PID를 인쇄하는 데 사용할 수 있습니다 .
ps -axjf | awk -v pid=$$ '($2==pid){print $1}'
그런 다음 해당 PID를 에 전달 ps
하고 명령 이름을 인쇄하도록 지시할 수 있습니다.
ps -o comm= $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}')
그러면 이름이 잘립니다. 이름을 알아내기에는 충분하지만 스크립팅에는 좋지 않을 수 있습니다. 전체 이름을 얻으려면 시도해 볼 수 있습니다.
ps --no-headers $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}') | awk '{print $NF}'
이것은 몇 가지 다른 터미널을 사용하여 내 시스템에서 얻은 것입니다.
terminator
$ ps --no-headers $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}') | awk '{print $NF}' /usr/bin/x-terminal-emulator
gnome-terminal
$ ps --no-headers $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}') | awk '{print $NF}' /usr/lib/gnome-terminal/gnome-terminal-server
xterm
$ ps --no-headers $(ps axjf | awk -v pid=$$ '($2==pid){print $1}') | awk '{print $NF}' xterm
답변3
상위 프로세스의 이름이나 경로를 가져오는 이식 가능한 방법은 다음과 같습니다.
iTerm 2:
$ ps -p $(ps -p $$ -o ppid=) -o comm=
/Applications/iTerm.app/Contents/MacOS/iTerm
우분투의 그놈 터미널:
$ ps -p $(ps -p $$ -o ppid=) -o comm=
gnome-terminal
터미널 앱:
$ ps -p $(ps -p $$ -o ppid=) -o comm=
login
Terminal.app이 기본 로그인 셸을 사용하여 새 셸을 열도록 설정된 경우 셸의 상위 프로세스는 login
터미널이 아니라 셸입니다.
이 comm
열은 OS X 명령의 전체 경로이고 Linux의 procps 구현에서는 15자로 잘린 명령 이름입니다.