Redirecionando um Makefile dentro de um cat heredocument varrendo variáveis e quebra de linha

3

Execução:

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

Cria isso depois de executar 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

Como você pode ver, após a execução, a linha relevante no segundo exemplo é apenas uma linha longa (sem quebras de linha, representadas por barras invertidas, E a variável $@ não aparece em nenhum lugar. Por que isso aconteceria após redirecionar? ?

    
por JohnDoea 29.03.2017 / 23:55

1 resposta

2

Da seção Here Documents de man bash

The format of here-documents is:

     <<[-]word
            here-document
     delimiter

No parameter and variable expansion, command substitution, arithmetic expansion, or pathname expansion is performed on word. If any characters in word are quoted, the delimiter is the result of quote removal on word, and the lines in the here-document are not expanded. If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion, the charac‐ ter sequence \ is ignored, and \ must be used to quote the characters \, $, and '.

Como MAKE está sem aspas no seu exemplo, \ é ignorado e $@ está sendo expandido (para uma lista de parâmetros presumivelmente vazia).

A solução é citar (qualquer parte do) marcador, por exemplo.

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

ou

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

ou para fornecer as fugas requeridas, e. \ para as continuações de linha e \$@ para $@

    
por 30.03.2017 / 00:43