-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)
socat
pseudo-tty 쌍을 사용하고 cmd
stdin을 슬레이브 부분에 연결합니다( [ -t 0 ]
그런 다음 true를 반환합니다).
의사 터미널은 원시 모드로 전환되므로 라인 규칙이 데이터를 방해하지 않아야 하므로 그 점에서 파이프와 거의 동일합니다.
그러나 의사 터미널은 파이프처럼 한쪽 끝에서만 닫힐 수 없습니다. 따라서 더 이상 입력이 없다고 socat
는 할 수 없습니다 . cmd
대신 socat
stdin이 파일 끝에 도달한 후 socat
잠시 기다렸다가 pseudo-tty를 삭제합니다. 이는 일반적으로 cmd
SIGHUP을 수신함을 의미합니다.
명령이 데이터를 처리하는 데 시간이 더 오래 걸리거나 작업 수행을 시작하기 전에 표준 입력에서 파일이 끝날 때까지 기다리는 경우 명령이 제대로 작동하지 않습니다.
답변2
이 명령은 설명자가 TTY와 관련되어 있는지 확인하기 위해 test
실행됩니다 .isatty(fd)
isatty(3)
파일 설명자가 ioctl(2)
터미널 호출을 설명자로 보낼 수 있는지 여부를 확인하는 C 라이브러리 함수입니다.
LD_PRELOAD=
따라서 isatty()
셸에서 재정의 기능을 사용하지 않으면 결과를 가짜로 만들 수 없습니다.