Por que os documentos aqui tentam a substituição do shell mesmo em uma linha comentada?

6

Eu queria ver como algumas artes ASCII apareciam no terminal:

$ cat <<EOF                                                                                                                                                                                  
> #          ____         _
> #  _   _  / __/  ___ _ | |_
> # | | | |/ /    /  _' || __|
> # | |_| |\ \__                     
por cat 29.01.2016 / 01:30

2 respostas

16

Isso é mais geral que o bash. No shell POSIX, o seu EOF é referido como uma palavra , na discussão de aqui-documentos :

If no characters in word are quoted, all lines of the here-document shall be expanded for parameter expansion, command substitution, and arithmetic expansion. In this case, the <backslash> in the input behaves as the <backslash> inside double-quotes (see Double-Quotes). However, the double-quote character ( '"' ) shall not be treated specially within a here-document, except when the double-quote appears within "$()", "''", or "${}".

As citações são feitas usando aspas simples, aspas duplas ou o caractere de barra invertida. POSIX menciona os documentos aqui na discussão de citando :

The various quoting mechanisms are the escape character, single-quotes, and double-quotes. The here-document represents another form of quoting; see Here-Document.

A chave para entender a falta de tratamento dos caracteres # é a definição dos documentos aqui:

allow redirection of lines contained in a shell input file

Ou seja, nenhum significado (além de possível expansão de parâmetro, etc.) é dado aos dados pelo shell, porque os dados são redirecionados para outro programa: cat , que não é um intérprete de shell. Se você redirecionasse para um programa shell , o resultado seria o que a shell pudesse fazer com os dados.

    
por 29.01.2016 / 01:40
8

Dentro de um documento aqui não há linhas de comentário.

man bash :

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 character sequence \ is ignored, and \ must be used to quote the characters \, $, and '.

Então você precisa:

cat <<"EOF"
    
por 29.01.2016 / 01:35