'tty' 명령의 출력과 '/dev/tty' 파일이 현재 bash 프로세스의 제어 터미널을 가리키나요?

'tty' 명령의 출력과 '/dev/tty' 파일이 현재 bash 프로세스의 제어 터미널을 가리키나요?
  1. ~에서man tty

    tty - 표준 입력에 연결된 터미널의 파일 이름을 인쇄합니다.

    $ tty
    /dev/pts/2
    
  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/2bash 쉘의 제어 터미널이 아닌가요?

/dev/tty/dev/pts/2서로 심볼릭 링크가 아니므로 서로 다른 파일입니까 ?

감사해요.

후속 게시물현재 제어 터미널과 `/dev/tty` 사이의 관계는 무엇입니까?

답변1

명령 tty(1)은 표준 입력에 연결된 터미널의 이름을 반환합니다. 이는 제어 터미널일 수도 있고 아닐 수도 있습니다. 프로세스에 제어 터미널이 있을 수도 있지만 터미널이 표준 입력에 연결되어야 한다는 것은 확실하지 않습니다.

POSIX에서tty(1)의 매뉴얼 페이지:

tty 유틸리티는 표준 입력으로 열린 터미널의 이름을 표준 출력에 기록해야 합니다. 사용된 이름은 ttyname()POSIX.1-2008 시스템 인터페이스 볼륨에 정의된 함수가 반환한 문자열과 동일해야 합니다.

직접 시도해 보세요.

< /dev/null sh -c 'tty; sleep 10; echo "Done."'

ttystdin은 (의사) 터미널이 아니기 때문에 "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서로 다른 프로세스의 제어 터미널이 다르고 심볼릭 링크가 각 프로세스마다 동일하기 때문에 심볼릭 링크가 될 수 없습니다.

관련 정보