구현하다:
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
\\
또는 줄 연속을 위해 필요한 탈출을 제공합니다 \$@
.$@