테스트를 위해 설명자를 -t 터미널로 표시

테스트를 위해 설명자를 -t 터미널로 표시

-t test를 사용하여 설명자가 터미널에 연결되어 있는지 테스트할 수 있습니다.

if [ ! -t 0 ]; then
    echo "Stdin is not from terminal"
fi

파일이나 프로세스를 가리키는 설명자 X가 있습니다(>(cmd) 리디렉션 사용). 터미널처럼 보이게 만들 수 있나요? 테스트를 통과하려면 -t?

답변1

대신 파이프 대신 tty가 되고 싶은 것이 표준 입력 >(cmd)이라고 가정하면 다음을 사용해 볼 수 있습니다.cmd

>(socat -u - exec:'cmd',pty)

socatpseudo-tty 쌍을 사용하고 cmdstdin을 슬레이브 부분에 연결합니다( [ -t 0 ]그런 다음 true를 반환합니다).

의사 터미널은 원시 모드로 전환되므로 라인 규칙이 데이터를 방해하지 않아야 하므로 그 점에서 파이프와 거의 동일합니다.

그러나 의사 터미널은 파이프처럼 한쪽 끝에서만 닫힐 수 없습니다. 따라서 더 이상 입력이 없다고 socat는 할 수 없습니다 . cmd대신 socatstdin이 파일 끝에 도달한 후 socat잠시 기다렸다가 pseudo-tty를 삭제합니다. 이는 일반적으로 cmdSIGHUP을 수신함을 의미합니다.

명령이 데이터를 처리하는 데 시간이 더 오래 걸리거나 작업 수행을 시작하기 전에 표준 입력에서 파일이 끝날 때까지 기다리는 경우 명령이 제대로 작동하지 않습니다.

답변2

이 명령은 설명자가 TTY와 관련되어 있는지 확인하기 위해 test실행됩니다 .isatty(fd)

isatty(3)파일 설명자가 ioctl(2)터미널 호출을 설명자로 보낼 수 있는지 여부를 확인하는 C 라이브러리 함수입니다.

LD_PRELOAD=따라서 isatty()셸에서 재정의 기능을 사용하지 않으면 결과를 가짜로 만들 수 없습니다.

관련 정보