스크립트에서 터미널을 식별하는 방법은 무엇입니까?

스크립트에서 터미널을 식별하는 방법은 무엇입니까?

그리고 " "라고 말하지 마세요 $TERM. 항상 입니다 xterm.

bash스크립트는 실행 중인 터미널, 특히 iTerm, Terminal.app 또는 실제로 xterm인지 어떻게 알 수 있습니까 ?

resetTerminal.app 및 iTerm2에서는 기본적으로 작동하지 않기 때문에 묻습니다 . 그러나 iTerm2는 터미널 재설정( )을 수행하기 위한 이스케이프 시퀀스를 인식하며 \x1b]50;ClearScrollback\x07, 이를 감지할 수 있으면 reset올바른 작업을 수행하는 별칭으로 재정의할 수 있습니다. AFAICT, Terminal.app에는 재설정 시퀀스가 ​​없으며사람들은 그 문제를 해결하기 위해 터무니없는 톰 해커리(Tom-Hackery)에 의지합니다..

여기서 나의 최종 목표는 resetOS 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}'

이것은 몇 가지 다른 터미널을 사용하여 내 시스템에서 얻은 것입니다.

  1. terminator

    $ ps --no-headers $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}') | 
       awk '{print $NF}'
    /usr/bin/x-terminal-emulator
    
  2. gnome-terminal

    $ ps --no-headers $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}') | 
       awk '{print $NF}'
    /usr/lib/gnome-terminal/gnome-terminal-server
    
  3. 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자로 잘린 명령 이름입니다.

관련 정보