고양이 문서는 여기

고양이 문서는 여기

저는 Linux와 쉘 스크립팅을 처음 접했고 기본 사항을 배우려고 노력하고 있습니다. 나는 현재 여기 문서를 설명하는 리디렉션 장을 읽고 있습니다. 아래 코드가 cat명령과 어떻게 작동하는지 실제로 이해할 수 없습니다 . 누구든지 말해 줄 수 있다면?

cat << EOF
line1 
line2
line3
EOF

나는 그것이 어떻게 작동하는지 정확히 알고 있습니다 << EOF. 키워드는 입력의 끝을 나타냅니다. 내 문제는 cat출력 스트림에 내용을 인쇄할 수 있도록 파일 이름을 입력 스트림으로 가져오는 것입니다. 위의 작동 방식내부? 우리는 어디에도 파일 이름을 지정하지 않았습니다. 쉘이 내부적으로 임시 파일을 생성하여 에 공급합니까 cat? 내 질문이 명확해지기를 바랍니다.

답변1

명령줄에 파일 이름이 지정되지 않은 경우 cat(또는 파일 이름이 바로 -) 표준 입력에서 읽기로 전환됩니다.

이는 다음을 의미합니다.

cat <<END
something something
END

cat파일 이름이 지정되지 않았으며 표준 입력 스트림에 도착하는 문서에서 계속 읽음을 알 수 있습니다.

cat표준 입력 및 파일에서 읽을 수 있습니다 .

cat - filename <<END
something something
END

이렇게 하면 여기에 있는 문서의 내용이 의 내용에 연결됩니다 filename. 매개변수의 순서가 이면 filename -이는 데이터 연결의 순서이기도 합니다.

이는 -쉘에 특별한 것이 아니며 cat유틸리티(및 일부 다른 유틸리티)에 의해서만 "표준 입력"으로 해석됩니다. -실행해야 하는 실제 파일이 있는 경우 를 cat사용하십시오. cat ./-즉, 경로와 함께 파일 이름을 지정하십시오.


모든 목적을 위해 임시 파일을 생성한 다음 표준 입력 스트림에 추가된 파일을 사용하여 유틸리티를 호출하는 방법으로 이 문서를 유틸리티에 직접 공급하는 것을 고려할 수 있습니다.

printf 'some contents' >tmpfile
utility <tmpfile
rm -f tmpfile

여기서 문서는 실제로 이런 방식으로 구현되지 않을 수도 있지만(FIFO(명명된 파이프)일 수 있음) 생각해보면 완전히 잘못된 방식은 아닙니다.

소스 코드를 읽어보면 bash특정 셸은 mkstemp()가능한 경우 임시 파일을 생성하기 위해 라이브러리 함수를 사용하여 이 문서를 구현하고, 그렇지 않으면 쓸 임의의 파일 이름을 생성하려고 시도하는 것으로 보입니다. 그런 다음 문서의 내용이 해당 파일에 기록되고 및 를 사용하여 파일의 내용을 마치 파일에서 나온 것처럼 읽는 표준 입력에 데이터가 제공 됩니다 <.redir.clib/sh/tmpfile.cbash

관련 정보