밑바닥 티?

밑바닥 티?

나는 터미널에서 놀고 있었고 다음과 같이 했습니다.

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이렇게 할 수 없습니다.

관련 정보