Por que 'while .. read .. EOL' está executando uma expansão de variável, ainda file e | não?

6

Além da expansão de variável mencionada no título da pergunta, também tenho outro problema alarmante ao ler dados em linha para <<EOL ... Quando os dados contêm um backtick ', isso causa um erro .

Ambos são problemas de substituição, mas o que e onde é a opção relevante? ... (e por que o inline se comporta de maneira diferente?)

Aqui está o script

#!/bin/bash
echo '==$BASH' | \
while IFS= read -r line ; do echo "# output 1: $line" ;done

echo '==$BASH'>junk
while IFS= read -r line ; do echo "# output 2: $line" ;done <junk

while IFS= read -r line ; do echo "# output 3: $line" ;done <<EOL
==$BASH
EOL

while IFS= read -r line ; do echo "# output 4: $line" ;done <<EOL
'my backtick test
EOL

Esta é a saída

# output 1: ==$BASH
# output 2: ==$BASH
# output 3: ==/bin/bash
...: bad substitution: no closing "'" in 'my backtick test
    
por Peter.O 16.04.2011 / 07:39

1 resposta

12

A expansão da Shell é um dos principais benefícios de 'aqui documentos'. A boa notícia é que você pode desligá-lo.

Tente:

while IFS= read -r line ; do echo "# output 3: $line" ;done <<'EOL'
==$BASH
EOL

while IFS= read -r line ; do echo "# output 4: $line" ;done <<'EOL'
'my backtick test
EOL

Para detalhes, consulte:

> info bash

< ... >

3.6.6 Here Documents
--------------------

This type of redirection instructs the shell to read input from the
current source until a line containing only WORD (with no trailing
blanks) is seen.  All of the lines read up to that point are then used
as the standard input for a command.

   The format of here-documents is:
     <<[-]WORD
             HERE-DOCUMENT
     DELIMITER

   No parameter expansion, command substitution, arithmetic expansion,
or filename 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.  In the latter case,
the character sequence '\newline' is ignored, and '\' must be used to
quote the characters '\', '$', and '''.

   If the redirection operator is '<<-', then all leading tab
characters are stripped from input lines and the line containing
DELIMITER.  This allows here-documents within shell scripts to be
indented in a natural fashion.
    
por 16.04.2011 / 07:56