
나는 터미널에서 놀고 있었고 다음과 같이 했습니다.
printf 'some string\n' | {
tee /dev/fd/3 | {
: && sed 's/some/string/'
}
} 3>&0
저는 다음과 같은 화면이 가득한 것을 보고 정말 놀랐습니다.
string string
string string
string string
...
그것은 거의 영원히 계속되었습니다. 나는 그것을 일부 요약하고 더 잘 설명하기 위해 다음을 시도해 볼 수 있습니다.
echo | tee /dev/fd/0 | sed =
나에게는 다음과 같은 출력이 표시됩니다.
<num>
#blank
<num+1>
#blank
...
등등. 내가 칠 수 있을 때까지 몇 번 시도했지만 CTRL+ C라인 200k+에 있었습니다. bash
, dash
, sh
및 에서 이것을 시도했는데 zsh
모두 동일한 결과가 나타납니다.
무슨 일이 일어나고 있는 걸까요? 파일 설명자는 |pipe
제가 생각했던 별도의 프로세스 사이를 어떻게 전달합니까? 이것이 신뢰할 수 있거나 예상되는 동작입니까? 이 효과를 생성하는 다른 방법이 있습니까?
참고로:
echo '#blank' | {
uname -r
readlink -f /dev/fd/0
tee /dev/fd/0
} | sed '=;5q'
산출
1
3.14.6-1-ARCH
2
/proc/24925/fd/pipe:[5851017]
3
#blank
4
#blank
5
#blank
답변1
/dev/fd/0
현재 프로세스의 표준 입력입니다. tee
사용자가 제공한 파일과 stdout 모두에 입력을 씁니다. 따라서 tee
(빈) 줄을 읽은 다음 해당 줄을 stdout( sed
)과 자체 입력에 모두 쓰고, 여기서 방금 쓴 줄을 읽고, 이를 stdout과 자체 입력에 쓰는 등의 무한 루프를 생성합니다( 비어 있음) 라인*. 이 sed
명령은 줄 번호를 인쇄한 다음 해당 줄을 인쇄합니다.
echo --> tee --> sed
^---+
* 단순한 것보다 더 많은 입력이 제공되면 echo
이 명령은 입력을 반복하여 반복합니다.
참고: OSX(BSD)에서는 에 쓸 수 없으므로 /dev/fd/0
이렇게 할 수 없습니다.