답변:
셸에 따라 다르며 AFAICS는 문서화되어 있지 않습니다. 에서 ksh
및 bash
의 첫 번째 경우 foo
와 동일한 stdin을 공유합니다 bar
. 그들은 출력을 위해 싸울 것입니다echo
.
예를 들어
$ seq 10000 | paste - <(tr 1 X)'
1 X
2 X042
3 X043
4 X044
5 X045
[...]
paste
다른 모든 텍스트 블록 을 읽는 증거를 볼 수 있습니다.seq
를 tr
읽는 동안의 출력 됩니다.
을 사용 zsh
하면 외부 stdin을 얻습니다 (터미널이 아니며 쉘이 대화 형이 아닌 경우에는에서 리디렉션됩니다 /dev/null
). ksh
(원산지),zsh
및 bash
만 Bourne의 형상 프로세스 AFAIK 교체를 지원하는 쉘.
에서는 echo "bla" | bar < <(foo)
주 것을 bar
의 표준 입력을 출력으로 공급 배관 것이다 foo
. 그것은 잘 정의 된 행동입니다. 이 경우, 그 표시 foo
의 표준 입력에 의해 공급 파이프이다 echo
의 모두가 ksh
, zsh
그리고 bash
.
세 가지 셸에서 일관된 동작을 원하고 동작이 문서화되지 않아 변경 될 수 있기 때문에 미래에 대비하려면 다음과 같이 작성하십시오.
echo bla | { bar <(foo); }
확실히 foo
의 표준 입력으로부터도 파이프입니다 echo
(당신이 생각을 할 싶어 내가 왜 볼 수 없습니다). 또는:
echo bla | bar <(foo < /dev/null)
하려면 확실히 foo
않습니다 하지 에서 파이프에서 읽을 echo
. 또는:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
foo
현재 버전에서와 같이 외부 stdin을 stdin 하려면 zsh
.
echo "bla" | foo | bar
:의 출력이 (으 echo "bla"
)로 리디렉션되고 해당 foo
출력이 (으)로 리디렉션 됨bar
.
echo "bla" | bar <(foo)
:의 출력을 echo "bla"
로 파이프합니다 bar
. 그러나 bar
인수로 실행됩니다. 인수는 파일 설명자에 대한 경로이며 출력 foo
이 전송됩니다. 이 인수는의 출력을 포함하는 파일처럼 동작합니다 foo
. 따라서 동일하지 않습니다.
echo "bla" | bar < <(foo)
:의 출력 echo "bla"
이 전송되어야 bar
하고 전체 명령문이 첫 번째 명령문과 동일 하다고 가정 할 수 있습니다 . 그러나 그것은 맞지 않습니다. 다음과 같은 상황이 발생합니다. 파이프 ( ) 다음 에 입력 리디렉션 <
이 수행 |
되므로 덮어 씁니다 . 따라서 echo "bla"
파이프에 파이프되지 않습니다. 대신의 출력은 foo
표준 입력으로 리디렉션됩니다 bar
. 이를 지우려면 다음 명령 및 출력을 참조하십시오.
$ echo "bla" | cat < <(echo "foo")
foo
당신이보다시피 echo "bla"
으로 대체됩니다echo "foo"
.
이제이 명령을보십시오 :
$ echo "bar" | cat < <(awk '{printf "%s and foo", $0}')
bar and foo
그래서 echo "bar"
파이프됩니다 awk
stdin을 읽고 문자열을 추가하는 and foo
출력에. 이 출력은로 파이프됩니다 cat
.
awk
""막대 " 를 읽는 것이 정의 된 행동입니까?"입니다.
cmd1 < <(cmd2)
와 동일하게 작동합니다 cmd2 | cmd1
.
cmd1 | cmd2 | cmd3
cmd1 | cmd3 < <(cmd2)