Here Document

Linux

0 views

1. 개요 및 정의

  • Here Document는 유닉스/리눅스 쉘의 리다이렉션 기법 중 하나로, 스크립트 내에서 표준 입력으로 여러 줄의 텍스트를 인라인으로 전달할 때 사용되는 구문이다.
    • 일반적으로 << 연산자와 구분자를 사용하여 시작과 끝을 명시한다.

2. 동작 원리

2.1 쉘 파싱 및 입력 처리

  1. 구분자 인식:
    1. 쉘은 << 연산자를 만나면 그 뒤에 오는 문자열을 종료 구분자로 인식한다.
    2. (예: << EOF에서 EOF가 구분자이다.)
  2. 입력 스트림 대체:
    1. 쉘은 다음 줄부터 종료 구분자가 나타날 때까지의 모든 라인을 해당 명령의 표준 입력으로 간주하고, 이를 임시 파일처럼 처리하여 명령어(예: cat, ssh 등)에게 전달한다.
  3. 변수 확장 처리:
    1. 기본적으로 Here Document 내부의 내용은 변수 확장, 명령 치환 등이 발생한다.
    • 예를 들어, $VARIABLE은 실제 변수 값으로 대체된다.
  4. 따옴표를 사용한 확장 방지:
    1. 종료 구분자를 작은따옴표로 감싸면(예: << 'EOF'), 쉘은 내부의 변수 확장을 수행하지 않고 원문 그대로를 표준 입력으로 전달한다.
    2. 이를 Here String과 구분하는 중요한 특징이다.

2.2 내부 동작 과정

  1. 임시 파일 생성:
    1. 쉘은 Here Document의 내용을 저장하기 위해 시스템의 임시 디렉터리(일반적으로 /tmp)에 숨겨진 임시 파일을 생성한다.
  2. 내용 복사:
    1. 스크립트 내 Here Document 섹션의 모든 텍스트가 이 임시 파일에 기록된다.
  3. 리다이렉션:
    1. 쉘은 명령을 실행하면서 표준 입력(stdin)을 이 임시 파일로 리다이렉션(0< temp_file)한다.
  4. 실행 후 삭제:
    1. 명령 실행이 완료된 후, 쉘은 생성된 임시 파일을 자동으로 삭제하여 시스템을 깨끗하게 유지한다.

3. 사용법 및 구분

3.1 기본 구문

COMMAND << DELIMITER
문자열 라인 1
문자열 라인 2
...
DELIMITER

3.2 cat을 이용한 파일 생성

cat > my_file.txt << EOF
Hello, world!
이것은 Here Document로 작성된 내용입니다.
변수 확장도 가능함 (아래 예시 참고)
EOF
image.png

3.3 변수 확장 예시

USER_NAME="Swoo"

cat << END_OF_TEXT
현재 로그인된 사용자는 $USER_NAME 입니다.
쉘 버전은 $(bash --version | head -n 1) 입니다. # 명령 치환도 작동한다.
END_OF_TEXT
image.png

3.4 변수 확장 비활성화 예시

USER_NAME="Swoo"

cat << 'EOT'
$USER_NAME은 변수 확장 없이 문자열 그대로 출력된다.
$(whoami)도 그대로 출력된다.
EOT
image.png

Loading comments...