쉘이 터미널에 "연결된"경우에만, 즉 표준 입력이 터미널 입력에서 나오고 표준 출력 (및 표준 오류? 상관 없음)이 인쇄 / 반향되는 경우에만 일부 작업을 수행하려고합니다. 터미널.
GNU / Linux 관련 (예 :)에 /proc/self
직접 의존하지 않고 어떻게해야 합니까?
쉘이 터미널에 "연결된"경우에만, 즉 표준 입력이 터미널 입력에서 나오고 표준 출력 (및 표준 오류? 상관 없음)이 인쇄 / 반향되는 경우에만 일부 작업을 수행하려고합니다. 터미널.
GNU / Linux 관련 (예 :)에 /proc/self
직접 의존하지 않고 어떻게해야 합니까?
답변:
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 ...
이 조건을 작성하는 관용적 방법입니다.
이미 주어진 훌륭한 답변들에 대한 추가 메모. [ -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
) 를 통해보다 정확하게 터미널 유형을 쿼리하기 위해 장치 식별 이스케이프 시퀀스를 보내려고합니다 .
printf
실패 할 수 있지만 stdin이 읽기 + 쓰기 모드로 열린 tty 장치 인 경우 부작용이 있습니다 그 순서를 다른 쪽 끝으로 보내는 예를 들어 위의 ssh 예제에서 실제로는 시퀀스를 터미널로 보냅니다 (그러나 응답은 stdin에 오지 않습니다)