Linux의 Bash에서 "Here Documents"를 사용하는 방법

게시 됨: 2022-01-29
Linux 컴퓨터 시스템의 터미널 창.
Fatmawati Achmad Zaenuri/Shutterstock

이상한 이름의 "여기 문서"를 사용하면 Linux의 Bash 스크립트 내에서 입력/출력 리디렉션을 사용할 수 있습니다. 원격 컴퓨터에서 실행하는 데 필요한 명령을 자동화하는 좋은 방법입니다.

여기 문서

Linux의 많은 명령에는 두 개 또는 세 개의 문자 이름이 있습니다. 이것은 부분적으로 Linux가 배우기 어렵고 난해한 명령으로 가득 차 있다는 개념을 불러일으킵니다. 그러나 Linux에서 가장 이상한 이름 중 하나는 비밀스러울 정도로 짧은 이름이 아닙니다. "여기 문서"는 문서가 아니며 "여기"가 무엇을 가리키는지도 명확하지 않습니다.

상대적으로 모호한 구성이지만 유용합니다. 물론 이것은 Linux이므로 고양이의 피부를 벗기는 방법은 여러 가지가 있습니다. 여기 문서에서 제공하는 일부 기능은 다른 방법으로 재현할 수 있습니다. 이러한 대체 방법은 일반적으로 더 복잡합니다. 프로그래밍 및 스크립팅에서 "더 복잡하다"는 것은 "버그가 발생하기 쉽다"는 의미이며 코드를 유지 관리하기가 더 어렵습니다.

여기에서 문서가 정말 뛰어난 곳은 스크립트 내에서 설정된 연결에서 원격 컴퓨터로 보내려는 명령의 자동화에 있습니다. 연결하는 것은 쉽지만 일단 연결되면 스크립트에서 원격 컴퓨터의 셸로 명령을 "펌핑"하는 방법은 무엇입니까? 여기 문서를 사용하면 매우 간단하게 수행할 수 있습니다.

Here 문서의 기본 원리

here 문서의 관용적 표현은 다음과 같습니다.

 명령 << 제한_문자열
 .
 .
텍스트 
데이터
변수
.
.
limit_string
  • COMMAND : 리디렉션된 입력을 허용하는 모든 Linux 명령이 될 수 있습니다. echo 명령은 리디렉션된 입력을 허용하지 않습니다. 화면에 써야 하는 경우 cat 명령을 사용할 수 있습니다.
  • << : 리디렉션 연산자입니다.
  • limit_string : 레이블입니다. 명령으로 리디렉션하는 데이터 목록에 표시되지 않는 한 원하는 것은 무엇이든 될 수 있습니다. 텍스트, 데이터 및 변수 목록의 끝을 표시하는 데 사용됩니다.
  • 데이터 목록 : 명령에 공급할 데이터 목록입니다. 여기에는 명령, 텍스트 및 변수가 포함될 수 있습니다. 데이터 목록의 내용은 _limit_string을 만날 때까지 한 번에 한 줄씩 명령에 입력됩니다.
광고

제한 문자열로 "EOF"를 사용하는 문서의 예를 여기에서 볼 수 있을 것입니다. 우리는 그 접근 방식을 선호하지 않습니다. 작동하지만 "EOF"는 "파일 끝"을 의미합니다. 홈 문서가 스크립트 파일의 마지막 항목인 드문 경우를 제외하고는 "EOF"가 잘못 사용되고 있습니다.

수행 중인 작업을 참조하는 제한 문자열을 사용하면 스크립트를 훨씬 더 읽기 쉽게 만들 수 있습니다. SSH(Secure Shell)를 통해 원격 컴퓨터에 일련의 명령을 보내는 경우 "_remote_commands"와 같은 제한 문자열이 적합합니다. 밑줄 " _ " 문자로 시작할 필요가 없습니다. 스크립트에서 비정상적인 것으로 표시하기 때문에 그렇게 하는 것입니다.

간단한 예

명령줄과 스크립트에서 여기 문서를 사용할 수 있습니다. 터미널 창에 다음을 입력하면 "Enter" 키를 누를 때마다 " > " 줄 연속 프롬프트가 표시됩니다. "_end_of_text" 제한 문자열을 입력하고 "Enter" 키를 누르면 웹 사이트 목록이 cat, 에게 전달되고 터미널 창에 표시됩니다.

 고양이 << _end_of_text 
How-To 괴짜 
리뷰 괴짜 
라이프세이비 
클라우드에 정통한 IT
마인드바운스
_end_of_text 

이것은 가장 가치 있는 연습은 아니지만 전체 데이터 목록이 대조되고 제한 문자열에 도달할 때까지 명령에 아무 것도 전송되지 않음을 보여줍니다. cat 명령은 제한 문자열 "_end_of_text"를 입력하고 "Enter" 키를 누를 때까지 입력을 받지 않습니다.

스크립트에서 동일한 작업을 수행할 수 있습니다. 이 예제를 편집기에 입력하거나 복사하고 파일을 "heredoc-1.sh"로 저장하고 편집기를 닫습니다.

 #!/bin/bash

고양이 << "_end_of_text"
사용자 이름: $(whoami)
현재 작업 디렉토리: $PWD
Bash 버전: $BASH_VERSION
_end_of_text

이 기사를 따르면 스크립트를 생성할 때마다 스크립트를 실행하기 전에 실행 가능하게 만들어야 합니다. 각각의 경우에 chmod 명령을 사용하십시오. 여기에 사용된 스크립트 이름을 각 예의 스크립트 이름으로 대체하십시오.

 chmod +x heredoc-1.sh 

광고

이 스크립트에는 $PWD$BASH_VERSION 의 두 가지 환경 변수가 포함되어 있습니다. 환경 변수 이름은 스크립트가 실행될 때 데이터 값(현재 작업 디렉토리 및 Bash 버전)으로 대체됩니다.

스크립트는 또한 whoami 명령에서 명령 대체 를 사용합니다. 명령의 이름은 자체 출력으로 대체됩니다. 전체 스크립트의 출력은 cat 명령에 의해 터미널 창에 기록됩니다. 이름으로 호출하여 스크립트를 실행합니다.

 ./heredoc-1.sh 

스크립트를 수정하고 here 문서의 첫 번째 줄에 있는 제한 문자열을 인용 부호 " " "로 묶으면 데이터 목록이 그대로 here 문서 명령으로 전달됩니다. 변수 값 대신 변수 이름이 표시되며 명령 대체는 발생하지 않습니다.

 #!/bin/bash

고양이 <<- "_end_of_text"
사용자 이름: $(whoami)
현재 작업 디렉토리: $PWD
Bash 버전: $BASH_VERSION
_end_of_text
 ./heredoc-1.sh 

탭 문자 처리

기본적으로 데이터 목록의 탭 문자는 유지되고 터미널 창에 기록됩니다. 이 예제를 복사하여 "heredoc-2.sh"로 저장합니다. chmod 명령을 사용하여 실행 가능하게 만드십시오. 들여쓴 줄을 편집하여 일련의 공백이 아닌 줄 시작 부분에 하나 또는 두 개의 탭 문자가 있는지 확인합니다.

 #!/bin/bash

고양이 << _end_of_text
사용자 이름: $(whoami)
  현재 작업 디렉토리: $PWD
    Bash 버전: $BASH_VERSION
_end_of_text
 ./heredoc-2.sh 

탭은 터미널 창에 기록됩니다.

리디렉션 연산자에 대시 " - "를 추가하면 here 문서에서 선행 탭 문자를 무시합니다. 이 예제를 "heredoc-3.sh"로 저장하고 실행 가능하게 만드십시오.

 #!/bin/bash

고양이 <<- _end_of_text
사용자 이름: $(whoami)
  현재 작업 디렉토리: $PWD
    Bash 버전: $BASH_VERSION
_end_of_text
 ./heredoc-3.sh 

탭은 무시됩니다. 이것은 사소해 보일 수 있지만 스크립트의 들여쓰기된 섹션으로 인해 선행 탭에 대처하는 깔끔한 방법입니다.

광고

루프 및 기타 논리적 구성은 일반적으로 들여쓰기됩니다. here 문서가 스크립트의 들여쓰기된 섹션에 포함되어 있는 경우 리디렉션 연산자와 함께 대시 " - "를 사용하면 선행 탭 문자로 인해 발생하는 형식 문제가 제거됩니다.

 #!/bin/bash

사실이면; 그 다음에
  고양이 <<- _limit_string
  선행 탭이 있는 1행.
  선행 탭이 있는 2행.
  선행 탭이 있는 3행.
  _limit_string
파이

파일로 리디렉션

here 문서와 함께 사용된 명령의 출력은 파일로 리디렉션될 수 있습니다. here 문서의 첫 번째 줄에 있는 제한 문자열 뒤에 " > "(파일 생성) 또는 " >> "(파일이 없으면 생성, 파일이 있으면 추가) 리디렉션 연산자를 사용합니다.

이 스크립트는 "heredoc-4.sh"입니다. 출력을 "session.txt"라는 텍스트 파일로 리디렉션합니다.

 #!/bin/bash

고양이 << _end_of_text > session.txt
사용자 이름: $(whoami)
현재 작업 디렉토리: $PWD
Bash 버전: $BASH_VERSION
_end_of_text
 ./heredoc-4.sh
 고양이 세션.텍스트 

출력을 다른 명령으로 파이핑

here 문서에 사용된 명령의 출력은 다른 명령의 입력으로 파이프될 수 있습니다. 파이프 사용 " | ” 연산자는 here 문서의 첫 번째 줄에 있는 제한 문자열 뒤에 있습니다. here 문서 명령 cat 의 출력을 sed 로 파이프할 것입니다. 문자 "a"의 모든 항목을 문자 "e"로 대체하고 싶습니다.

이 스크립트의 이름을 "heredoc-5.sh"로 지정합니다.

 #!/bin/bash

고양이 << _end_of_text | sed 's/a/e/g'
어떻게
에게
가악
_end_of_text
 ./heredoc-5.sh

"Gaak"는 "Geek"으로 수정됩니다.

함수에 매개변수 보내기

here 문서와 함께 사용되는 명령은 스크립트의 함수일 수 있습니다.

이 스크립트는 일부 차량 데이터를 함수에 전달합니다. 함수는 사용자가 입력한 것처럼 데이터를 읽습니다. 그런 다음 변수 값이 인쇄됩니다. 이 스크립트를 "heredoc-6.sh"로 저장합니다.

 #!/bin/bash

# set_car_details() 함수
set_car_details()
{
읽다
모델 읽기
new_used 읽기
읽기 delivery_collect
위치 읽기
가격 읽기
}

# set_car_details()에 데이터를 전달하는 here 문서
set_car_details << _mars_rover_data
나사
인내 로버
사용 된
모으다
화성(경도, 위도) 77.451865,18.445161
22억
_mars_rover_data

# 차량 세부 정보 검색
echo "만들기: $make"
echo "모델: $model"
echo "신품 또는 중고: $new_used"
echo "배달 또는 수집: $delivery_collect"
echo "위치: $location"
echo "\$ 가격: $price"
 ./heredoc-6.sh 

터미널 창에 차량 정보가 기록됩니다.

이메일 작성 및 보내기

여기 문서를 사용하여 이메일을 작성하고 보낼 수 있습니다. 리디렉션 연산자 앞의 명령에 매개변수를 전달할 수 있습니다. Linux mail 명령을 사용하여 로컬 메일 시스템을 통해 "dave"라는 사용자 계정으로 이메일을 보냅니다. -s (제목) 옵션을 사용하면 이메일의 제목을 지정할 수 있습니다.

이 예제는 스크립트 "heredoc-7.sh"를 형성합니다.

 #!/bin/bash

article="여기 문서"

mail -s '작업 부하 상태' dave << _project_report
사용자 이름: $(whoami)
과제 완료:
기사: $article
_프로젝트 보고서
 ./heredoc-7.sh 

광고

이 스크립트에는 보이는 출력이 없습니다. 하지만 메일을 확인해보면 메일이 작성, 발송, 전달되었음을 알 수 있습니다.

 우편 

SSH에서 Here 문서 사용하기

여기 문서는 SSH 연결이 설정되면 원격 컴퓨터에서 일부 명령을 실행하는 강력하고 편리한 방법입니다. 두 컴퓨터 간에 SSH 키를 설정한 경우 로그인 프로세스는 완전히 자동입니다. 이 빠르고 간단한 예에서는 원격 컴퓨터의 사용자 계정에 대한 암호를 묻는 메시지가 표시됩니다.

이 스크립트는 "heredoc-8.sh"입니다. "remote-pc"라는 원격 컴퓨터에 연결할 것입니다. 사용자 계정을 "dave"라고 합니다. 대화형 의사 터미널을 할당할 필요가 없기 때문에 -T (의사 터미널 할당 비활성화) 옵션을 사용하고 있습니다.

스크립트의 "do some work in here" 섹션에서 명령 목록을 전달할 수 있으며 이러한 명령은 원격 컴퓨터에서 실행됩니다. 물론 원격 컴퓨터에 있는 스크립트를 호출할 수도 있습니다. 원격 스크립트는 실행하려는 모든 명령과 루틴을 보유할 수 있습니다.

우리 스크립트(heredoc-8.sh)가 할 일은 원격 컴퓨터의 연결 로그를 업데이트하는 것입니다. 사용자 계정과 시간 및 날짜 스탬프가 텍스트 파일에 기록됩니다.

 #!/bin/bash

ssh -T [email protected] << _remote_commands

# 여기서 일 좀 해

# 연결 로그 업데이트
echo $USER "-" $(날짜) >> /home/dave/conn_log/script.log
_remote_commands
광고

명령을 실행하면 원격 컴퓨터의 계정에 대한 암호를 묻는 메시지가 표시됩니다.

 ./heredoc-8.sh 

원격 컴퓨터에 대한 일부 정보가 표시되고 명령 프롬프트로 돌아갑니다.

원격 컴퓨터에서 cat 을 사용하여 연결 로그를 확인할 수 있습니다.

 고양이 conn_log/script.log 

각 연결이 나열됩니다.

관련: Linux 셸에서 SSH 키를 만들고 설치하는 방법

이상한 이름, 깔끔한 기능

여기 문서는 기발하지만 강력합니다. 특히 원격 컴퓨터에 명령을 보내는 데 사용할 때 그렇습니다. rsync 를 사용하여 백업 루틴을 스크립팅하는 것은 간단한 문제입니다. 그런 다음 스크립트는 원격 컴퓨터에 연결하여 남은 저장 공간을 확인하고 공간이 부족해지면 경고 이메일을 보낼 수 있습니다.

관련: rsync를 사용하여 Linux 시스템을 백업하는 방법