Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

Bash/Linux 셸에서 Heredoc(Here Document) 사용법 완벽 가이드

이 글에서는 Bash/셸 스크립트에서 Heredoc(Here Document)을 사용하여 여러 줄의 텍스트를 다루는 방법을 소개합니다.

Heredoc은 여러 줄 입력을 처리할 때 가장 유용합니다. 사용자가 한 줄의 텍스트를 입력하고 Enter 키를 누른 뒤, 다음 줄을 이어서 입력하는 방식으로 동작하며, 스크립트 안에서 여러 줄 텍스트를 정의하는 용도로도 활용할 수 있습니다.

또한 실행 중인 대화형 프로그램에 여러 개의 명령을 한 번에 전달하는 데도 사용할 수 있습니다. 구체적인 예시는 아래에서 확인할 수 있습니다.

이 글의 예제는 Bash와 Zsh 셸 모두에서 동일하게 작동합니다.

표준 입력, 파이프, 리다이렉션

Heredoc은 표준 입출력과 리다이렉션/파이핑과 함께 자주 사용되며, 이를 통해 여러 줄 텍스트를 다른 명령어로 전달해 처리, 포맷팅 또는 화면 출력을 수행합니다. 이 주제는 그 자체로 하나의 글이 필요할 만큼 방대하지만, 핵심 개념만 간단히 짚고 넘어가겠습니다.

아래 예제에서는 표준 입력(stdin), 표준 출력(stdout), 표준 에러(stderr)의 리다이렉션 개념이 여러 차례 등장합니다.

Bash/Zsh Heredoc 문법

Heredoc을 시작하는 방법은 간단합니다. << 기호를 사용하면 됩니다. 이것은 앞서 설명한 입출력 리다이렉션의 한 형태입니다.

Heredoc의 기본 문법은 다음과 같습니다:

COMMAND <<LIMITSTRING
text line 1
text line 2
...
LIMITSTRING

각 요소를 살펴보면 다음과 같습니다:

  • COMMAND: 모든 Linux 명령어나 스크립트를 사용할 수 있으며, Heredoc에 담긴 텍스트 내용이 리다이렉션을 통해 해당 명령으로 전달됩니다.
  • <<: Heredoc 문장의 시작을 정의합니다.
    • 여러 줄 텍스트를 들여쓰기 하면서 작성할 계획이라면 <<-(하이픈 추가)를 대신 사용하세요. 각 줄 앞의 탭 문자를 자동으로 제거해 줍니다.
  • LIMITSTRING: Heredoc의 텍스트 입력을 종료하기 위해 반드시 입력해야 하는 문자열입니다.
    • Heredoc은 여러 줄로 구성되며 Enter 키로 다음 줄로 넘어가기 때문에, Enter 키만으로는 입력을 끝낼 수 없습니다.
    • LIMITSTRING이 나타나면 Heredoc은 더 이상 입력받지 않고 종료됩니다.
    • 문자열은 무엇이든 지정할 수 있습니다. 단, 본문 텍스트에 절대 등장하지 않을 문자열을 선택해야 의도치 않게 조기 종료되는 일을 막을 수 있습니다.
    • 관례적으로 EOF(End Of File의 약자)를 LIMITSTRING으로 많이 사용합니다. 물론 Heredoc 본문에 'EOF'라는 텍스트가 포함되지 않는 경우에 한합니다.
  • 텍스트의 줄 수에는 제한이 없습니다.

Heredoc 실전 예제

여러 줄 텍스트 입력 받기

다음 예제는 여러 줄의 텍스트를 입력받아 cat 명령으로 화면에 출력합니다:

cat <<EOF
This is line 1
This is line 2
EOF

위 예제는 터미널 프로그램에 직접 입력해서 실행해 볼 수 있습니다.

변수 사용하기

Heredoc 안에서는 셸 변수를 그대로 사용할 수 있습니다:

cat <<EOF
This is line 1
This is line 2
Your current directory is $PWD
EOF

위 예제에서 $PWD 변수가 Heredoc의 한 줄에 사용되었습니다. 이 변수는 현재 작업 디렉터리 경로를 담고 있으며, 실행 시점에 실제 값으로 치환되어 출력됩니다.

Heredoc 출력 리다이렉션하기

표준 리다이렉션을 활용하면 COMMAND로 전달된 Heredoc의 결과물을 다른 프로그램이나 파일로 보낼 수 있습니다:

cat <<EOF > output.txt
This is line 1
This is line 2
Your current directory is $PWD
EOF

위 예제에서 cat은 Heredoc의 내용을 읽고, > 연산자를 통해 cat의 출력이 output.txt 파일에 저장됩니다.

스크립트에서 여러 줄 텍스트 정의하기

스크립트 안에서도 Heredoc을 사용할 수 있습니다. 셸 스크립트는 본질적으로 셸에 순차적으로 전달되는 명령어 목록이므로, 터미널에서 직접 입력할 때와 동일하게 동작합니다.

스크립트 코드를 들여쓰기 하면 가독성이 좋아지는데, 이때 들여쓰기 탭이 텍스트에 포함되기를 원하지 않는다면 Heredoc 선언부에 -(하이픈)를 추가하세요. 각 줄 시작 부분의 공백(탭)이 제거됩니다:

#!/bin/bash

if $trueOrFalse; then
    cat <<-EOF > output.txt
    This is line 1
    This is line 2
    Your current directory is $PWD
    EOF
fi

Heredoc을 변수에 할당하기

cat 명령으로 Heredoc의 여러 줄 텍스트를 읽어들인 뒤, 그 출력을 변수에 할당하면 스크립트 변수에 저장할 수 있습니다:

mytext=$(cat <<-EOF 
    This is line 1
    This is line 2
    Your current directory is $PWD
    EOF
)

echo $mytext

대화형 프로그램에 여러 명령 전달하기

Heredoc은 대화형 프로그램에 여러 줄의 텍스트를 전송하는 용도로도 활용됩니다. 어떤 프로그램들은 실행된 후 사용자가 직접 명령을 입력하기를 기다립니다. 텍스트를 받아 처리하거나, 자체적인 셸을 제공하여 명령을 입력받기도 합니다.

대표적인 예가 MySQL입니다. MySQL이 실행되어 서버에 접속한 후에는 명령을 입력하고 Enter 키를 눌러 데이터를 조회할 수 있습니다. Heredoc을 사용하면 이러한 명령들을 미리 작성해 두고, 사용자 개입 없이 MySQL에 자동으로 전달할 수 있습니다:

mysql -uUSERNAME -pPASSWORD DATABASE <<EOF
SHOW TABLES;
SELECT * FROM posts;
EOF

위 예제에서 mysql 명령은 지정된 USERNAME과 PASSWORD로 DATABASE에 접속합니다.

연결이 완료되면 두 개의 SQL 명령이 순차적으로 실행됩니다. 하나는 SHOW TABLES로 테이블 목록을 조회하고, 다른 하나는 posts 테이블의 모든 레코드를 SELECT하는 명령입니다.