구분된 문서 내에서 구분된 문서를 올바른 방식으로 들여쓰는 방법은 무엇입니까?

구분된 문서 내에서 구분된 문서를 올바른 방식으로 들여쓰는 방법은 무엇입니까?

다음 코드는 Apache 설치를 위한 스크립트입니다. 스크립트를 래핑하는 Heredoc 블록(APACHE)에서 실행될 때 스크립트를 그 자리에서 실행합니다.

이 APACHE here 문서에는 "보조" 또는 "내부" here 문서라고 부를 수 있는 내부 here 문서(MOD_REWRITE)가 있습니다.

또한 내부적으로 구분된 문서 내의 코드를 제외하고 APACHE 내의 모든 코드는 들여쓰기되어 있습니다(표).

bash /dev/fd/10 10<<'APACHE'

    # Setup basics:

    apt-get update -y && apt-get upgrade -y
    apt-get install tree zip unzip
    a2enmod mcrypt && a2enmod mbstring

    # Setup LAMP environment with enabled mod rewrite:

    echo -e "\07" && echo -e "\077" # Insert password.
    apt-get install lamp-server^ -y
    a2enmod rewrite

cat <<MOD_REWRITE >> /etc/apache2/apache2.conf

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
MOD_REWRITE

    systemctl restart apache2.service

    # Setup maldet:

    cd /usr/local/src
    wget http://www.rfxn.com/downloads/maldetect-current.tar.gz && tar -xzf maldetect-current.tar.gz
    cd maldetect-* && bash ./install.sh

APACHE

탭 대신 공백이 포함된 명령을 사용하여 들여쓰기하면 스크립트를 제대로 실행할 수 있습니다(MOD_REWRITE가 없는 한). MOD_REWRITE를 추가하면 실행 중에 스크립트가 중지됩니다. 모든 공백 들여쓰기를 제거하고 이를 테이블로 완전히 바꾸면 동일한 일이 발생합니다. 그러나 제가 아는 한, 마지막으로 테이블을 사용하여 스크립트를 실행하려고 시도했을 때에도 깨졌습니다. (사이에 하이픈을 추가하더라도)bash /dev/fd/10 10<< 그리고 'APACHE'.

내 질문:

스크립트가 더 균일하고 실행 시 중단되지 않도록 MOD_REWRITE here 문서를 APACHE here 문서에 들여쓰기하는 올바른 방법은 무엇입니까?

노트:

  • 나는 또한 미학적 이유로 다른 명령과 마찬가지로 내부 heredoc를 들여쓰기하는 것을 좋아합니다. 이렇게 하면 스크립트를 더 쉽게 읽고 구성할 수 있습니다.

  • 이 질문은 "중첩된 들여쓰기와 일치하도록 구분 기호를 들여쓸 수 없습니다."외부 여기 문서 자체를 들여쓰기하는 대신 외부 여기 문서 내에서 내부 여기 문서를 들여쓰기하는 올바른 방법을 묻기 때문입니다.

답변1

여기에 문서화된 내용은 다음 형식의 리디렉션입니다.

<<[-]DELIMITER
    ....
    ....
    ....
DELIMITER

선택적으로 -(위의 괄호에서) 구분 기호가 일치하는 방식을 변경하고 탭을 사용하여 문서 내용 내의 각 줄을 구분하기 위해 들여쓰기를 허용합니다(공백은 허용되지 않음).

  • "일치"는 구분 기호가 시작 문자와 일치함을 의미합니다(예: 또는 DELIMITER일치 시 ).<<DELIMITER<<-DELIMITER

  • <<<<-다음 단어 사이에는 하나 이상의 공백을 사용할 수 있습니다 .

단일 정리 내에서 매칭의 기본 규칙을 요약하면 다음과 같습니다.

  1. 병따개를 놓아야합니다처음에해당 구문의 줄.
  2. 구분 기호는 다음과 같아야 합니다.유일한 단어그 라인.
  3. 여는 문자(구분 기호 포함) 아래의 모든 내용은 원하는 만큼 들여쓰기할 수 있습니다.시트, 그리고 <<-DELIMITER문법.

이전 구문을 사용하면 heredoc 시작 부분에 공백이 있어서는 안 됩니다. 들여쓰기를 하려면 유일한 옵션은 다음 구문을 사용하는 것입니다. 그리고 heredoc 내용 내 각 줄의 시작 부분에 탭을 구체적으로 사용해야 합니다. .

이제 두 가지 구문 옵션이 있습니다 <<-.

첫 번째 옵션

<<-내부적으로 구분된 문서의 구문을 사용하십시오 .

bash << APACHE
    ... 
    ... 
    cat <<- MOD_REWRITE
⇨       ...     
⇨       ....    
⇨       MOD_REWRITE
    ... 
    ... 
APACHE

(들여쓰기는 공백 4개, 표는 기호로 표현 )

여러분이 보는 코드는 bash화면에 쓰여진 것과 똑같습니다(즉, bash지금 보는 것처럼 각 줄이 들여쓰기되어 있는 것을 볼 수 있습니다). 내부 구분 기호가 충족되면 각 줄 시작 부분의 탭 문자는 <<-구문상의 이유로 bashMOD_REWRITE 구분 기호까지 제거됩니다.

두 번째 옵션

<<-외부 구분 기호를 사용하는 구문.

bash <<- APACHE
⇨       ...
⇨       ...
⇨       cat << MOD_REWRITE
⇨       ⇨       ...
⇨       ⇨       ....
⇨       MOD_REWRITE
⇨       ...
⇨       ...
APACHE

이번에 표시되는 코드는 bash본 코드와 다릅니다. 선행 테이블이 포함되지 않습니다. 이것이 내부적으로 구분된 문서의 구문을 사용할 때 이것이 문제가 되지 않는 이유입니다 <<. MOD_REWRITE 구분 기호는 줄의 시작 부분에 있습니다.

두 경우 모두 MOD_REWRITE 구분 기호가 인식되고 Apache 구성 파일이 /etc/apache2/apache2.conf들여쓰기되지 않습니다. 일부를 들여쓰려면 공백을 사용하는 것이 유일한 옵션입니다(제거될 초기 테이블 뒤에).

물론 세 번째 옵션도 있습니다. <<-두 문서 모두에 구문을 사용하는 것입니다. 그러나 코드가 bash.

답변2

먼저, cat줄과 후속 줄(종료자가 있는 줄 제외 NGINX)을 들여쓰기하면 작동합니다. 문서의 선행 들여쓰기는 출력에서 ​​유지되며, 이는 귀하의 경우에 문제가 될 수도 있고 그렇지 않을 수도 있습니다(출력이 실제로 HTML인 경우 추가 공백을 도입하는 것은 중요하지 않을 수 있습니다).

또한 Bash 문서에는 다음과 같이 나와 있습니다.

The format of here-documents is:

       <<[-]word
               here-document
       delimiter

[...]

If the redirection operator is <<-, then all leading tab characters are
stripped from input lines and  the  line  containing  delimiter.   This
allows  here-documents within shell scripts to be indented in a natural
fashion.

따라서 <<-'PHP_FPM'리디렉션에 의해 제거되는 탭 문자 뒤의 각 줄을 사용하고 들여쓰기할 수 있습니다.

관련 정보