나는 > 및 >> 연산자를 알고 있습니다. >는 이전 내용을 삭제하여 파일에 무언가를 넣고 >>는 파일 내용의 끝에 무언가를 추가합니다.
그냥 사용했을 때
cat > foo
ctrl+z를 누를 때까지 foo에 여러 줄을 대화식으로 쓸 수 있으며 그 다음에는 끝납니다.
이제 추가 연산자와 내가 선택한 단어를 역순으로 추가하면
cat > foo << "wordofchoice"
첫 번째 경우와 동일한 작업을 수행할 수 있지만 이번에는 > 프롬프트가 각 줄의 시작 부분에 나타나고 Ctrl+Z를 통해 대화형 입력을 종료할 수 없지만 대신 "wordofchoice"를 입력하여(이중 입력 없이) 따옴표) 대화형 입력을 종료합니다.
왜 이런 일이 발생하는지, 이 표현의 논리는 무엇인지, << 연산자는 여기서 무언가를 추가하는 데 아무런 의미가 없는 것 같습니다.
답변1
$PS2
- 사용자가
\n
대화형 셸에서 명령줄을 완료하기 전에 ewline을 입력할 때마다 이 변수의 값은 매개변수 확장되어 표준 오류에 기록되어야 합니다. 기본값은 입니다>
.
- 사용자가
>
이것이 - 의 기본값이기 때문에 개행 $PS2
문자가 포함된 명령 문자열을 적절하게 구분할 수 없을 때 쉘이 인쇄할 프롬프트 문자열입니다.
인용된 문자열을 닫지 않았으므로 명령 문자열을 구분할 수 없습니다.
- 다양한 인용 메커니즘에는 이스케이프 문자, 작은따옴표 및 큰따옴표가 포함됩니다. 여기에 있는 문서는 대체 인용 형식을 나타냅니다.여기 문서.
쉘 파서토큰화한 줄씩 읽을 때 입력하세요. ewline 을 보냈습니다 \n
. 이는 터미널이 지금까지 명령의 복사본을 보냈지만 적어도 하나의 열린 인용 문자열(즉, 불완전한 명령 하나)을 감지했음을 의미합니다. 따라서 메시지가 표시됩니다. 나머지 작업을 수행합니다..
- 현재 문자가
\
백슬래시,'
작은따옴표 또는"
큰따옴표이고 따옴표가 없으면 인용된 텍스트가 끝날 때까지 후속 문자의 인용에 영향을 줍니다. 인용규칙은 다음과 같습니다인용하다. 토큰 인식 중에는 실제로 대체가 수행되어서는 안 되며, 결과 토큰에는 입력에 나타난 문자가 정확히 포함되어야 합니다.\n
(ewline>가입 제외)\'"
, 포함되거나 둘러싸는 따옴표 또는 따옴표와 인용 텍스트 끝 사이의 대체 연산자를 포함하여 수정 없이. 토큰은 인용된 필드의 끝으로 구분되어서는 안 됩니다.
Here-document는 다음과 같은 이유로 특별한 인용 형태입니다.리디렉션- 쉘은 시작 토큰 과 <<heredoc_delimiter_string\n
예상 종료 토큰 으로 구분된 입력을 리디렉션합니다.\nheredoc_delimiter_string\n
command
<<start_here_document
.
\n
여기의 문서는 다음 줄 줄부터 시작하여 다음 줄만 포함하는 줄이 나올 때까지 계속되는 단어로 처리되어야 합니다.<<delimiter
그리고\n
eline, 아니공백사이의 문자. 그런 다음 다음 여기 문서가 시작됩니다(있는 경우). 형식은 다음과 같습니다.[n]<<word here-document delimiter
두 번째 쉘 토큰을 의미하는 다른 것을 쉘의 파서에 제출하지만 닫는 토큰 앞에 개행 문자를 전달하는 경우 쉘은 유사하게 작동합니다. 예를 들어, $PS2
ewline이나 이미 언급된 다른 인용문 앞에 for
입력하지 않고 루프를 시작 하면 이것이 인쇄됩니다.done
\n
\n
명령에 ewline을 배치하는 또 다른 방법은 터미널을 사용하여 이를 인용하는 것입니다. 일반적으로 다음 입력 문자에 축어적 인용을 사용할 수 있습니다 CTRL+V
. 네가 CTRL+V
그렇게 하면CTRL+J
(또는 \n
엘라인)일반적으로 터미널이 입력 내용의 복사본을 쉘에 즉시 보내지 않고도 명령 문자열에 리터럴 ewline을 입력할 수 있습니다 \n
. 왜냐하면 일반적으로 터미널은 한 줄씩 보내지만,CTRL+V
인용하다쉘은 개행 문자도 허용하지 않으므로 추가 입력을 요청하는 메시지가 표시되지 않습니다.
그러나 이는 터미널에서 인용된 개행 문자가 셸에서도 올바르게 인용된다는 의미는 아닙니다. 이를 수행하려면 적용 가능한 경우 셸 따옴표를 사용해야 합니다. 그러나 최소한 명령 문자열을 읽을 때까지 읽을 수는 없습니다. 제출할 준비가 되었습니다.