~에서
man tty
tty - 표준 입력에 연결된 터미널의 파일 이름을 인쇄합니다.
$ tty /dev/pts/2
APUE에서:
역사적으로 대부분의 UNIX 시스템 버전에서 제어 터미널의 이름은 이었습니다
/dev/tty
. POSIX.1은 제어 터미널의 이름을 결정하기 위해 호출할 수 있는 런타임 함수를 제공합니다.#include <stdio.h> char *ctermid(char *ptr);
$ ls -la /dev/tty crw-rw-rw- 1 root tty 5, 0 May 26 00:16 /dev/tty
tty
그래서 명령의 출력 과 파일이 /dev/tty
모두 현재 bash 프로세스의 제어 터미널을 참조하는지 알고 싶습니다 .
그렇다면 명령이 다른 tty
의사 터미널 슬레이브 파일을 출력하는 이유는 무엇입니까?/dev/pts/2
/dev/tty
터미널 에뮬레이터 lxterminal
와 그 안에서 실행되는 bash 쉘은 의사 터미널 쌍을 사용하므로 의사 터미널 슬레이브가 /dev/pts/2
bash 쉘의 제어 터미널이 아닌가요?
/dev/tty
/dev/pts/2
서로 심볼릭 링크가 아니므로 서로 다른 파일입니까 ?
감사해요.
답변1
명령 tty
(1)은 표준 입력에 연결된 터미널의 이름을 반환합니다. 이는 제어 터미널일 수도 있고 아닐 수도 있습니다. 프로세스에 제어 터미널이 있을 수도 있지만 터미널이 표준 입력에 연결되어야 한다는 것은 확실하지 않습니다.
POSIX에서tty
(1)의 매뉴얼 페이지:
tty 유틸리티는 표준 입력으로 열린 터미널의 이름을 표준 출력에 기록해야 합니다. 사용된 이름은
ttyname()
POSIX.1-2008 시스템 인터페이스 볼륨에 정의된 함수가 반환한 문자열과 동일해야 합니다.
직접 시도해 보세요.
< /dev/null sh -c 'tty; sleep 10; echo "Done."'
tty
stdin은 (의사) 터미널이 아니기 때문에 "not a tty"라는 메시지를 본 후 Ctrl+C를 누르세요 .
반면에 는 /dev/tty
항상 프로세스의 제어 터미널과 동의어입니다. 단, 프로세스가 실제로가지다제어 터미널.
답변2
명령의 출력
tty
과 파일이/dev/tty
현재 프로세스의 제어 터미널을 가리키나요?
글쎄요, 그들은 동일하지 않습니다.tty
연결된 tty의 이름을 인쇄합니다.표준 입력. 이는 터미널을 제어하는 것과 반드시 동일하지는 않습니다./dev/tty
인용하다).
$ tty
/dev/pts/12
$ tty < /dev/pts/1
/dev/pts/1
$ tty < /dev/null
not a tty
물론 일반적으로 stdin
터미널에 연결하면 해당 터미널이 제어 터미널이 됩니다.
내가 본 사용 사례는 tty
스크립트가 대화형으로 실행되는지 확인하는 것입니다. 이를 위해서는 stdin
단말기를 제어하기보다는 점검을 통해 stdin
단말기 이외의 기기가 연결되어 사용자가 대화형 입력을 할 수 없는 상황을 감지할 수 있다. 예를 들어 maybe_interactive.sh < some_input_file
대화형 셸에서 실행합니다.
/dev/tty와 /dev/pts/2는 서로에 대한 심볼릭 링크가 아니므로 서로 다른 파일입니까?
/dev/tty
서로 다른 프로세스의 제어 터미널이 다르고 심볼릭 링크가 각 프로세스마다 동일하기 때문에 심볼릭 링크가 될 수 없습니다.