쉘이 터미널에서 실행 중인지 어떻게 확인합니까?


22

쉘이 터미널에 "연결된"경우에만, 즉 표준 입력이 터미널 입력에서 나오고 표준 출력 (및 표준 오류? 상관 없음)이 인쇄 / 반향되는 경우에만 일부 작업을 수행하려고합니다. 터미널.

GNU / Linux 관련 (예 :)에 /proc/self직접 의존하지 않고 어떻게해야 합니까?


답변:


33

isatty는 이것을 확인하는 함수이며 명령-t플래그test 는 쉘 스크립트에서 액세스 할 수 있습니다.

-t file_descriptor

파일 디스크립터 번호 file_descriptor 가 열려 있고 터미널과 연관되어 있으면 참 입니다. 경우 거짓 file_descriptor가 유효한 파일 기술자 번호가 아닙니다, 또는 파일 기술자 번호의 경우 file_descriptor가 열려 있지 않은, 또는 열려 있지만 터미널에 연결되지 않은 경우.

다음을 사용하여 FD 0 (표준 입력)이 TTY인지 확인할 수 있습니다.

test -t 0

FD 1 및 2에 대해 동일한 작업을 수행하여 출력 및 오류 스트림 또는 모두를 확인할 수 있습니다.

test -t 0 -a -t 1 -a -t 2

디스크립터가 터미널에 연결되어 있으면 명령이 0 (성공)을 리턴하고 그렇지 않으면 false를 리턴합니다.

test["브래킷 테스트"명령 으로도 사용할 수 있습니다 .

 if [ -t 0 ] ; then ...

이 조건을 작성하는 관용적 방법입니다.


8

나는 이것이 중복이라고 생각하지만 그것을 찾을 수 없습니다. 용도

[ -t 0 ]

[ -t 1 ]

표준 입력 및 출력이 터미널에 연결되어 있는지 각각 테스트합니다. man test세부 사항이 있습니다.


7

이미 주어진 훌륭한 답변들에 대한 추가 메모. [ -t 0 ]파일 디스크립터 0이 tty 라인 규칙을 가진 장치 파일 인 파일 중 하나 인지 테스트합니다 (일반적으로, 무해한 용어 ioctl ()이 성공했는지 확인하여 수행됨).

또한, 다른 쪽 끝에 터미널 또는 터미널 에뮬레이터 (실제 사용자가 키보드로 입력)가 있다는 것을 의미하지는 않습니다 (심지어 대다수의 경우와 아마도 관심있는 대부분의 경우). 근사).

tty 및 pty 장치는 데이터 전송 또는 프로세스 간 통신 메커니즘으로도 사용할 수 있습니다.

예를 들어, 다음을 수행 할 수 있습니다.

(stty raw -echo; myscript) < /dev/ttyS0

RS232를 통해받은 내용을에 공급합니다 myscript.

echo test | ssh -tt host myscript

것이다 myscript의 표준 입력 PTY 장치 인 (에 sshd()를 통해 SSH 연결되지 않은 단말 결국 타단하고 있지만 의해 공급 파이프 echo)

RS232 라인 또는 pty의 다른 쪽 끝에 터미널이 있는지 추가로 확인하기 위해 $TERM변수가 설정되어 있고 비어 있지 않은지 ( [ -n "$TERM" ]) 확인하고 해당 fd를 통해 장치 상태 보고서 이스케이프 시퀀스를 보내고 수신하는지 확인할 수 있습니다. 응답 ( [ -t 0 ]및 에 추가 [ -n "$TERM" ])

printf >&0 '\e[5n'

\e[0n대부분의 터미널에서 응답 합니다.

이제 몇 가지 문제가 있으므로 시각적 TUI 응용 프로그램을 실행하려고하기 때문에 확인하려는 경우를 제외하고는 권장하지 않습니다.이 경우 라이브러리를 사용하는 것이 좋습니다 ncurses. DSR 대신 $TERM) 를 통해보다 정확하게 터미널 유형을 쿼리하기 위해 장치 식별 이스케이프 시퀀스를 보내려고합니다 .

  • 고맙게도, stdin이 터미널이 아닌 대부분의 경우, 읽기 전용 모드로 열려서 printf실패 할 수 있지만 stdin이 읽기 + 쓰기 모드로 열린 tty 장치 인 경우 부작용이 있습니다 그 순서를 다른 쪽 끝으로 보내는 예를 들어 위의 ssh 예제에서 실제로는 시퀀스를 터미널로 보냅니다 (그러나 응답은 stdin에 오지 않습니다)
  • 답장을 안정적이고 이식 가능하게 읽는 것은 어렵습니다. tty 라인 규칙을 일시적으로 변경하고 한 번에 한 바이트 씩 읽어야합니다. 또한 응답이 표시되지 않으면 포기하고 터미널이없는 시간 초과를 결정해야합니다. 사람들이 위성 연결을 통해 전화를 거는 것을 고려하려면 시간이 오래 걸립니다.
  • 백그라운드에서 터미널에서 읽으면 SIGTTIN 신호로 스크립트가 일시 중단됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.