웹사이트 검색

쉘 스크립팅에서 Heredoc을 사용하는 방법


여기서 문서(Heredoc)는 특수 코드 블록으로 처리되는 입력 또는 파일 스트림 리터럴입니다. 이 코드 블록은 처리를 위해 명령으로 전달됩니다. HeredocUNIX 셸에서 시작되었으며 sh, tcsh, ksh, bash, zsh, csh와 같은 널리 사용되는 Linux 셸에서 찾을 수 있습니다. 특히 Perl, Ruby, PHP와 같은 다른 프로그래밍 언어도 heredoc를 지원합니다.

허독의 구조

Heredoc은 2개의 꺾쇠 괄호 (<<)구분 기호 토큰을 사용합니다. 코드 블록을 종료하는 데 동일한 구분 기호 토큰이 사용됩니다. 구분 기호 안에 들어오는 것은 모두 코드 블록으로 간주됩니다.

아래 예를 살펴보세요. 코드 블록을 cat 명령으로 리디렉션하고 있습니다. 여기서 구분 기호는 "BLOCK"으로 설정되고 동일한 "BLOCK"으로 종료됩니다.

cat << BLOCK
	Hello world
	Today date is $(date +%F)
	My home directory = ${HOME}
BLOCK

참고: 블록을 시작하고 종료하려면 동일한 구분 기호 토큰을 사용해야 합니다.

여러 줄 주석 생성

지금 bash에서 코딩을 하고 있다면 bash가 기본적으로 C 또는 Java와 같은 여러 줄 주석을 지원하지 않는다는 것을 알 수 있습니다. HereDoc을 사용하여 이 문제를 극복할 수 있습니다.

이것은 여러 줄 주석을 지원하는 bash의 내장 기능이 아니라 단지 해킹일 뿐입니다. heredoc을 어떤 명령으로 리디렉션하지 않으면 인터프리터는 코드 블록만 읽고 아무 것도 실행하지 않습니다.

<< COMMENT
	This is comment line 1
	This is comment line 2
	This is comment line 3
COMMENT

공백 처리

기본적으로 heredoc은 공백 문자(탭, 공백)를 억제하지 않습니다. (<<) 뒤에 대시(-)를 추가하고 그 뒤에 구분 기호를 추가하여 이 동작을 재정의할 수 있습니다. 그러면 모든 탭 공백이 억제되지만 공백은 억제되지 않습니다.

cat <<- BLOCK
This line has no whitespace.
  This line has 2 white spaces at the beginning.
    This line has a single tab.
        This line has 2 tabs.
            This line has 3 tabs.
BLOCK

변수 및 명령 대체

Heredoc은 변수 대체를 허용합니다. 변수는 사용자 정의 변수이거나 환경 변수일 수 있습니다.

TODAY=$(date +%F)
	
cat << BLOCK1
User defined variables
Today date is = ${TODAY}
#Environ Variables
I am running as = ${USER}
My home dir is = ${HOME}
I am using ${SHELL} as my shell
BLOCK1

마찬가지로 heredoc 코드 블록 내에서 모든 명령을 실행할 수 있습니다.

cat << BLOCK2
$(uname -a) 
BLOCK2

특수 문자 이스케이프

특수 문자를 이스케이프 처리하는 방법에는 여러 가지가 있습니다. 캐릭터 수준이나 문서 수준에서 수행할 수 있습니다.

개별 특수 문자를 이스케이프하려면 백슬래시(\)를 사용하세요.

cat << BLOCK4
$(uname -a)
BLOCK4

cat << BLOCK5
Today date is = ${TODAY}
BLOCK5

블록 내부의 모든 특수 문자를 이스케이프하려면 구분 기호를 작은따옴표, 큰따옴표로 묶거나 접두사 구분 기호를 백슬래시로 묶습니다.

cat << 'BLOCK1'
I am running as = ${USER}
BLOCK1

cat << "BLOCK2"
I am running as = ${USER}
BLOCK2

cat << \BLOCK3
I am running as = ${USER}
BLOCK3

이제 heredoc의 구조와 작동 방식을 알았으니 몇 가지 예를 살펴보겠습니다. 내가 heredoc을 사용하는 두 가지 일반적인 영역은 SSH를 통해 명령 블록을 실행하고 heredoc을 통해 SQL 쿼리를 전달하는 것입니다.

아래 예에서는 SSH를 통해 원격 서버에서 코드 블록을 실행하려고 합니다.

아래 예에서는 select 문을 psql에 전달하여 데이터베이스에 연결하고 쿼리를 실행합니다. 이는 .sql 파일을 실행하기 위해 -f 플래그를 사용하는 대신 bash 스크립트 내의 psql에서 쿼리를 실행하는 대체 방법입니다.

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

psql --username=${UNAME} --password --dbname=${DBNAME} << BLOCK
SELECT * FROM COUNTRIES
WHERE region_id = 4;
BLOCK

이것이 바로 이 기사입니다. 예제에 표시된 것보다 heredoc을 사용하여 더 많은 작업을 수행할 수 있습니다. heredoc에 대한 유용한 해킹이 있다면 독자들이 그 혜택을 누릴 수 있도록 댓글 섹션에 게시해 주세요.