cat > file << "END"는 어떻게 작동하나요?

cat > file << "END"는 어떻게 작동하나요?
$ cat > file << "END"
> asdf
> qwerty
> END
$ cat file
asdf
qwerty
$

위의 트릭이 어떻게 작동하는지 잘 모르겠습니다.

cat > file이는 의 출력이 cat리디렉션되어 에 기록된다는 의미라는 것을 어느 정도 이해할 수 있습니다 file.

이 부분은 << "END"어떻게 작동하나요 ? 나는 적어도 이것이 문자열이 다음 END과 같이 처리되어야 한다는 것을 의미한다고 가정 cat합니다. 따라서 file마지막에 세 글자로 구성된 줄만 포함해야 한다고 가정합니다 END. 이것이 어떻게 "콘솔에서 입력을 받아들이고 cat사용자가 입력할 때까지 구분 기호로 처리되어야 하는 문자열로 리디렉션"하는 것을 의미할 수 있는지는 알 수 없습니다.

답변1

귀하의 질문은 '어떻게'가 아닌 것 같습니다.여기 문서스크립트 파일에서 사용법을 올바르게 설명했기 때문에 작동합니다. 대화형 사용을 이해하지 못하는 것 같습니다. 다음은 여러분을 위해 문제를 해결해 줄 (매우 간단한) 집중 코스입니다.

모든 Unix 프로세스와 마찬가지로 셸에는 데이터를 읽고 쓸 수 있는 입력 및 출력 스트림이 있습니다. 여기에는 최소한 하나의 입력 스트림( 및 stdin)과 두 개의 출력 스트림( stdoutstderr)이 있지만 읽기 및 쓰기(주로 파일에서 읽기 또는 쓰기)에 필요한 만큼 입력 스트림을 열고 닫을 수 있습니다. 프로세스가 스트림을 처리하는 방법은 프로세스에 따라 다릅니다. 예를 들어, 인수 없이 호출되면 에 cat복사합니다 . 쉘은 일반적으로 입력 스트림을 실행할 명령으로 해석합니다(그리고 일부 구문에 따라 해당 명령에 대한 입력 및 출력 스트림을 설정합니다).stdinstdout

입력 데이터는 어디에서 오는가? 이는 이를 전송하는 다른 프로세스에서 올 수도 있고, 파일에서 읽을 수도 있고, 사용자(쉘)가 직접 입력할 수도 있습니다 stdin. 이 경우 사용자 입력을 받아 로드하는 다른 프로그램이 있어야 합니다. 스트림으로. 이러한 프로그램을 a 라고 하며 tty, 이 경우 스트림은 다음과 같습니다.에 첨부tty(이것은 tty창이 제공되는 터미널 에뮬레이터와 동일하지 않지만 광범위하게는 스트림이 다음과 같다고 말할 수도 있습니다.터미널에 연결하세요.)

쉘은 입력을 기다리는 동안 프롬프트를 인쇄하는 등 stdina에 연결되어 다르게 동작하는 시기를 알고 있지만 실제로는 큰 차이가 없습니다. tty프롬프트는 일반적으로 다음과 같습니다 user@host:current_path$. 변수를 변경하여 정확한 내용을 정의할 수 있습니다 PS1. 일반적인 관례는 $일반 사용자일 때 종료되고, 일반 #사용자일 때 종료된다는 것입니다 root.

스크립트를 실행하면 쉘은 스크립트가 포함된 파일에 입력 스트림을 추가하고 여기에서 명령을 읽습니다. 명령 중 하나에 다음이 포함된 경우여기 문서, 즉, 과 같은 <<END의미는 다음과 같습니다. 지금부터 이 종결자만 포함하는 줄까지 스트림 데이터를 명령으로 해석하는 것을 중지하고 stdin실행하려는 명령( cat귀하의 경우)에 전달하면 약간의 손상이 있을 수 있습니다. 지금은 그게 우리를 괴롭히지 않을 거예요. 이것은 아마도 다른 관점에서 볼지라도 이미 알고 있는 것입니다.

입력이 a 에 추가되면 tty여기에 있는 문서의 의미는 동일합니다. 즉, 스트림 데이터를 명령으로 해석하는 것을 중지하고 stdin종료자까지 실행하려는 명령에 전달합니다. 유일한 차이점은 입력을 기다리는 동안 프롬프트가 인쇄된다는 것입니다. 이 프롬프트는 쉘이 입력 데이터를 명령으로 해석할 때 인쇄되는 프롬프트와 동일하지 않으며 단지 전달될 것임을 알려줄 뿐입니다. 이는 PS2기본값이 로 설정된 변수로 정의됩니다 >. 입력할 때 종결자를 읽을 때까지 각 줄의 시작 부분에 표시됩니다. cat file > file << "END"이 시점에서 쉘은 정상적인 동작을 재개하고 PS1-prompt를 인쇄하고 입력이 명령으로 해석될 때까지 기다립니다.

관련 정보