표준 출력 리디렉션 후 파이프의 목적은 무엇입니까?

표준 출력 리디렉션 후 파이프의 목적은 무엇입니까?

문서를 읽고 있어요게알이전에 본 적이 없는 쉘 리디렉션과 파이프 구조를 보았습니다.

echo -e 'FROM alpine \nRUN echo "created from standard input"' > Dockerfile | tar -cf - Dockerfile

출력은 echo로 리디렉션 Dockerfile되고 내가 아는 한 아무것도 얻지 못합니다 |. 저는 항상 taror 와 명령을 &&결합하는데 ||, 이런 경우에는 파이프리스를 사용하는 특별한 목적이 있는지 궁금합니다.

답변1

명령줄은 유효하며 오타가 아닙니다.

Docker 컨테이너 내에서 다음 명령을 실행하면 작동하는 것을 확인할 수 있습니다.

docker run -it --rm alpine sh -c 'echo -e "FROM alpine \nRUN echo \"created from standard input\"" > Dockerfile | tar -cf - Dockerfile'

다음 명령을 사용하여 동일한 동작을 관찰할 수 있습니다 cat.

echo -e 'FROM alpine \nRUN echo "created from standard input"' > Dockerfile | cat Dockerfile

내 생각엔 당신이 제공된 옵션을 오해했을 수도 있다는 것입니다 tar. 표준 입력에서 읽는 대신 표준 출력에 씁니다.

설명하다

쉘은 첫 번째 프로세스( echo)와 해당 stdout( Dockerfile)을 생성한 후 다음 프로세스( tar)를 생성합니다. 두 프로세스 모두 실행을 시작하고 Dockerfile이미 존재 하므로 tar해당 프로세스에서 읽기를 시작하고 출력을 표준 출력에 쓸 수 있습니다.

어떤 경우에는 stdout이 tty이므로(일부 설명에서 볼 수 있듯이) stdout을 파일( )과 같이 tar가 쓸 수 있는 것으로 바꿔야 합니다 Dockerfile.tar. 원래 명령을 변경하지 않고 tar 명령에 출력 리디렉션을 추가하여 파일에 쓰기만 하면 동일한 결과를 관찰할 수 있습니다.

echo -e 'FROM alpine \nRUN echo "created from standard input"' >Dockerfile | tar -cf - Dockerfile >Dockerfile.tar

관련 정보