cat에서 Makefile 문서를 리디렉션하면 변수와 개행 문자가 사라집니다.

cat에서 Makefile 문서를 리디렉션하면 변수와 개행 문자가 사라집니다.

구현하다:

cat <<MAKE >> /etc/apache2/sites-available/Makefile1
% :
    printf '%s\n' \
    '<VirtualHost *:80>' \
    'DocumentRoot "/var/www/html/$@">' \
    'ServerName $@' \
    '<Directory "/var/www/html/$@">' \
    'Options +SymLinksIfOwnerMatch' \
    'Require all granted' \
    '</Directory>' \
    'ServerAlias www.$@' \
    '</VirtualHost>' \
    > "$@"
    a2ensite "$@"
    systemctl restart apache2.service
    mv /etc/apache2/sites-available/$@ /etc/apache2/sites-available/[email protected]
    # Before quotes == Tabuilations. Inside quotes == Spaces. After quotes == Spaces (1 space before backslash for line break). Also avoid any other spaces.
MAKE

다음을 실행한 후 이것을 생성하십시오 cd /etc/apache2/sites-available/ && make contentperhour.com.

% :
printf '%s\n' '<VirtualHost *:80>' 'DocumentRoot "/var/www/html/">' 'ServerName ' '<Directory "/var/www/html/">' 'Options +SymLinksIfOwnerMatch' 'Require all granted' '</Directory>' 'ServerAlias www.' '</VirtualHost>' > ""
a2ensite ""
systemctl restart apache2.service
mv /etc/apache2/sites-available/ /etc/apache2/sites-available/.conf

보시다시피, 실행 후 두 번째 예제의 관련 줄은 단 하나의 긴 줄(백슬래시로 표시되는 줄 바꿈 없음)이며 $@리디렉션 후에 이런 일이 발생하는 이유는 무엇입니까?

답변1

다음 Here Documents섹션 에서man bash

이 문서의 형식은 다음과 같습니다.

     <<[-]word
            here-document
     delimiter

매개변수 및 변수 확장, 명령 대체, 산술 확장 또는 경로 이름 확장은 단어에 대해 수행되지 않습니다. Word에 인용된 문자가 있는 경우 구분 기호는 Word에서 인용문을 제거한 결과이며 문서의 줄은 여기에서 확장되지 않습니다. 단어가 인용되지 않은 경우 문서의 모든 행은 매개변수 확장, 명령 대체 및 산술 확장을 거치며 문자 순서 \는 무시되며 \는 문자 \, $ 및 `를 인용하는 데 사용해야 합니다.

MAKE귀하의 예에서는 인용되지 않았기 때문에 \무시되고 $@확장됩니다(빈 매개변수 목록일 수 있음).

해결책은 마크업의 일부를 인용하는 것입니다.

cat <<\MAKE >> /etc/apache2/sites-available/Makefile1

또는

cat <<"MAKE" >> /etc/apache2/sites-available/Makefile1

\\또는 줄 연속을 위해 필요한 탈출을 제공합니다 \$@.$@

관련 정보