>와 | /dev/tty의 차이점

>와 | /dev/tty의 차이점

이 명령을 실행할 때:

echo "1" > /dev/tty # runs successfully 

하지만 내가 이것을 실행하면 :

echo "1" | /dev/tty #permission denied

이 두 연산자의 차이점은 무엇 >이며 |파이프가 오류를 일으키는 이유는 무엇입니까?

답변1

짧은 답변: >&n그 뒤에는 파일 이름이나 (n은 숫자) 가 와야 하고, |다른 명령 호출이 와야 합니다.


세부 사항:셸 구문에서 명령 호출에는 여러 구성 요소가 포함됩니다. 예:

A=foo 2>/dev/null B=bar cmd arg1 arg2 >file 3>&4 arg3

여기서 매개변수 2>/dev/null및 는 io 리디렉션을 설정하는 데 사용되며 명령줄의 어느 곳에나 나타날 수 있는 특수 매개변수(이스케이프되지 않은 1 포함 ) >file입니다 . 파일 설명자 2는 로 리디렉션되고 , 파일 설명자는 (암시적으로) 로 리디렉션되고 , 파일 설명자는 파일 설명자 4가 연결된 것으로 리디렉션됩니다.3>&4>/dev/null1file3

그런 다음 나머지 매개변수 중에는 포함되므로 A=foo명령 이름으로 간주되지 않습니다. 시작될 프로세스의 환경 변수에 특정 값을 제공합니다.B=bar=

그런 다음 명령 cmd과 실제 매개변수가 옵니다: arg1, arg2, arg3.

파이프는 |명령 호출의 일부가 아니며 두 호출을 함께 연결합니다. 예:

CC=gcc make 2>&1 | LESS=--quit-at-eof less

파일 설명자 1에 대한 첫 번째 프로세스의 출력은 버퍼 역할을 하는 "파이프"를 통해 파일 설명자 0에 대한 입력으로 두 번째 프로세스에 의해 수신됩니다.


1. 실제로 >이런 특수 문자 뒤에 공백이 오는 경우가 가끔 있습니다. 이것이 허용되더라도 두 개의 (공백으로 구분된) 문자열은 하나의 "엔티티"로 이해되어야 합니다.

답변2

|프로세스 간에 데이터를 전송하고 스트림 >을 파일로 리디렉션하는 데 사용됩니다. /dev/tty루트가 소유한 "파일"/장치이며 권한이 666으로 설정되어 있으므로 파이프로 연결하려고 하면 쉘이 /dev/tty를 실행하여 데이터를 전송하려고 시도하지만 실행 권한이 없습니다. .

관련 정보