밑바닥 티셔츠?

밑바닥 티셔츠?

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

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이 작업을 수행할 수 없습니다.

관련 정보