Here 문서(Heredoc )은 특수 코드 블록으로 처리되는 입력 또는 파일 스트림 리터럴입니다. 이 코드 블록은 처리를 위해 명령에 전달됩니다. 이단 UNIX에서 시작됨 쉘이며 sh, tcsh, ksh, bash, zsh, csh와 같은 인기 있는 Linux 쉘에서 찾을 수 있습니다. 특히 Perl, Ruby, PHP와 같은 다른 프로그래밍 언어도 heredoc을 지원합니다.
Herdoc의 구조
이단 꺾쇠 괄호 2개 사용 (<<)
뒤에 구분자 토큰이 옵니다. . 코드 블록을 종료하는 데 동일한 구분 기호 토큰이 사용됩니다. 구분 기호 안에 있는 모든 항목은 코드 블록으로 간주됩니다.
아래의 예를 보십시오. 코드 블록을 cat 명령으로 리디렉션하고 있습니다. 여기서 구분 기호는 "BLOCK으로 설정됩니다. ' 및 동일한 'BLOCK에 의해 종료됨 ".
cat << BLOCK Hello world Today date is $(date +%F) My home directory = ${HOME} BLOCK
참고 :블록을 시작하고 종료하려면 동일한 구분자 토큰을 사용해야 합니다.
여러 줄 주석 작성
지금 bash로 코딩하고 있다면 bash가 기본적으로 C와 같은 여러 줄 주석을 지원하지 않는다는 것을 알 수 있습니다. 또는 자바 . HereDoc을 사용할 수 있습니다. 이를 극복하기 위해.
이것은 여러 줄 주석을 지원하는 bash의 내장 기능이 아니라 해킹입니다. heredoc을 리디렉션하지 않는 경우 어떤 명령이든 인터프리터는 단순히 코드 블록을 읽고 아무 것도 실행하지 않습니다.
<< COMMENT This is comment line 1 This is comment line 2 This is comment line 3 COMMENT
공백 처리
기본적으로 heredoc 공백 문자(탭, 공백)를 억제하지 않습니다. dash (-)
를 추가하여 이 동작을 재정의할 수 있습니다. (<<)
뒤 뒤에 구분 기호가 옵니다. 이렇게 하면 모든 탭 공백이 표시되지 않지만 공백은 표시되지 않습니다.
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에 대한 문 데이터베이스에 연결하고 쿼리를 실행합니다. 이것은 psql에서 쿼리를 실행하는 다른 방법입니다. -f
를 사용하는 대신 bash 스크립트 내부 .sql 실행 플래그 파일.
#!/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에 유용한 해킹이 있다면 독자들이 이점을 누릴 수 있도록 댓글 섹션에 게시하십시오.