리디렉션과 파이프의 차이점과 관계를 알고 싶습니다.
- 파이프는 명령의 stdout 출력을 다른 명령의 stdin 입력에 연결하는 데에만 사용됩니까?
- 리디렉션은 명령의 stdout 출력을 파일에 연결하고 파일을 명령의 stdin 입력에 연결하는 데에만 사용됩니까? 하지만 있는 것 같습니다
command >& 2
. - 파이프는
com1 | com2
리디렉션으로 대체될 수 있습니다com1 > tempfile; com2 < tempfile
. 파일을 사용하지 않도록 대체 항목을 수정할 수 있나요? - 리디렉션을 파이프로 대체할 수 있나요?
감사드립니다!
답변1
예. 보다 정확하게는 셸에서 파이프는 왼쪽 명령의 표준 출력을 오른쪽 명령의 표준 입력에 연결합니다. 보다 정확하게
foo | bar
는 쉘의 경우 다음을 의미합니다.- 만들다관로.
- 하위 프로세스를 포크하고 파이프의 쓰기 끝을 표준 출력에 연결합니다. 그런 다음
foo
이 하위 프로세스에서 실행합니다. - 하위 프로세스를 포크하고 파이프의 읽기 끝을 표준 입력에 연결합니다. 그런 다음
bar
이 하위 프로세스에서 실행합니다. - 두 하위 프로세스가 모두 종료될 때까지 기다립니다.
예. 일반 리디렉션은 파일을 이름으로 나타냅니다.
>foo
리디렉션의 또 다른 형태는 다음으로 파일을 나타냅니다.설명자. 예를 들어,>&2
"파일 설명자 2가 현재 연결되어 있는 모든 항목으로 표준 출력을 리디렉션"을 의미합니다.해당 주제에서는 리디렉션이 왼쪽에서 오른쪽으로 처리된다는 점에 유의하세요. 예를 들어 표준 출력과 표준 오류를 동일한 파일로 리디렉션하려면 를 사용합니다
foo >filename 2>&1
. 터미널에 입력한 명령은foo 2>&1 >filename
먼저 표준 오류를 터미널에 연결합니다(이 시점에서는 표준 출력과 표준 오류가 여전히 터미널에 연결되어 있으므로 차이는 없습니다) 그런 다음 표준 출력을 파일에 연결하십시오.네,하지만. 셸의 파이프 생성자는 익명 파이프를 생성합니다.명명된 파이프.
mkfifo f cat f # (in another terminal) echo hello >f
명명된 파이프는 파이프보다 훨씬 덜 일반적입니다. 독립적으로 시작된 두 프로세스를 연결해야 할 때 이 기능을 사용하세요. 자주 발생하지는 않지만 필요할 때 사용하면 좋습니다.
귀하가 제공한 교체는
foo >tempfile; bar <tempfile
다릅니다. 먼저foo
모든 출력을 임시 파일에 쓴 다음bar
실행을 시작합니다. 파이프를 통해 명령을 병렬로 실행할 수 있습니다.예, 하지만 그다지 유용하지는 않습니다.
cat input_file | some_command # a uselessly complicated way of writing some_command <input_file echo hello | tee output_file # a uselessly complicated way of writing echo hello >output_file
답변2
1) 예(stderr 제외)
prg 2>&1 | workwithboth
2) 예(stderr 제외).
3) 아니요, 정확히는 아닙니다.
com1 > tempfile; com2 < tempfile.
com2는 com1이 완료된 후에 시작됩니다.
com1 | com2
com1의 출력 시작 부분은 com2로 즉시 처리될 수 있습니다. 예 - 파일 없음: 파이프를 사용합니다.
4) 창문을 문으로, 문을 창문으로 사용할 수 있는데 왜 이렇게 하는 걸까요? 문과 창문은 이유가 있어서 만들어졌습니다. 하늘에서 떨어지지 않습니다.