저는 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.c
lib/sh/tmpfile.c
bash