이 명령을 실행할 때:
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/null
1
file
3
그런 다음 나머지 매개변수 중에는 포함되므로 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를 실행하여 데이터를 전송하려고 시도하지만 실행 권한이 없습니다. .