É uma prática recomendada encapsular caminhos entre aspas?

1

Considere o seguinte código:

for domain; do
    cat << EOF > "/etc/nginx/sites-available/${domain}.conf"
        My \domain is ${domain}.
    EOF
done

Observe que o caminho /etc/nginx/sites-available/${domain}.conf é empacotado com aspas. É uma prática recomendada ou feita por causa da substituição de variáveis? Se for substituição de variável, não seria melhor ou mais comum colocar o nome da heredoc ( EOF )?

    
por Arcticooling 09.11.2017 / 03:04

1 resposta

3

As expressões citadas que contêm variáveis são uma melhor prática (em oposição a simplesmente ser um convenção ) em parte porque da expansão de variáveis:

Se a variável se expandir para uma string que contenha espaços em branco, por exemplo, seu código terminará gravando em um arquivo incorreto. Citando a palavra-chave heredoc afeta a expansão da variável, mas não da mesma maneira que a citação afeta as strings:

Especificamente, citando a palavra-chave heredoc impede a expansão da variável.

E, em qualquer caso, o caminho em questão não faz parte do corpo heredoc (que começa na linha após o primeiro delimitador) e, portanto, não seria afetado - ele deve ser citado de forma independente.

Observe também que (embora isso não esteja relacionado à sua pergunta) o heredoc no seu snippet de código é inválido, pois o delimitador de fechamento é recuado. Considere o seguinte trecho do Guia avançado de script de script :

The closing limit string, on the final line of a here document, must start in the first character position. There can be no leading whitespace. Trailing whitespace after the limit string likewise causes unexpected behavior. The whitespace prevents the limit string from being recognized.

A exceção a isso é o <<- style heredocs, que ignora o recuo de tabulação e também permite que o delimitador de fechamento seja indentado por tabulação. Isso é descrito na seguinte passagem extraída do Wiki do Wooledge Bash :

If you use <<-END instead of <<END as your Heredoc operator, Bash removes any tab characters in the beginning of each line of your Heredoc content before sending it to the command. That way you can still use tabs (but not spaces) to indent your Heredoc content with the rest of your code. Those tabs will not be sent to the command that receives your Heredoc. You can also use tabs to indent your sentinel string.

    
por 09.11.2017 / 03:23