나는 터미널에서 놀고 있었고 다음과 같이 했습니다.
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이미 200,000개 이상의 라인에 도달했습니다. 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
사용자가 제공하는 파일 및 표준 출력에 입력을 씁니다. 한 줄(공백)을 읽은 tee
다음 해당 줄을 stdout( sed
) 및 자체 입력에 씁니다. 여기서 방금 쓴 줄을 읽고 이를 stdout 및 자체 입력 등에 씁니다. 무한 루프(빈) 행을 만듭니다* . 이 sed
명령은 줄 번호를 인쇄한 다음 해당 줄을 인쇄합니다.
echo --> tee --> sed
^---+
* 단순한 입력 이상이 제공되면 echo
이 명령은 입력을 반복하여 반복합니다.
참고: OSX(BSD)에서는 쓰기를 허용하지 않으므로 /dev/fd/0
이 작업을 수행할 수 없습니다.