Como posso terminar um documento aqui que começa com \\ $ fff?

6

Foi-me feita a seguinte pergunta em um teste de shell script na minha universidade, que nunca deu uma resposta, e o google é de pouca ajuda.

Q: Qual é o separador de linha que deve ser usado para terminar este documento aqui?

fff=file
xyz <<\$fff
...
    
por Alexander 21.05.2015 / 08:31

2 respostas

9

A linha que termina o documento aqui é

\$fff

Da seção man bash nos documentos aqui:

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

word sofre remoção de cotações, por isso \$fff é dequoted para \$fff . Mas, como diz a manpage, nenhuma expansão de variáveis é feita, então permanece assim.

O corpo de um documento aqui pode ou não passar por uma expansão variável e interpretação de barra invertida. Nesse caso, como word contém um caractere entre aspas (ou seja, a barra invertida), a expansão de parâmetro e a delimitação de barra invertida são não executadas no texto do documento here.

No entanto, a entrada é comparada com a seqüência de terminação antes da expansão da variável, portanto, não é necessário que a barra inverta o \ nem o $ na linha de terminação.

    
por 21.05.2015 / 09:18
4

O terminador é

\$fff

Eu vou assumir que isso é o que @rici queria dizer. Como seu penúltimo parágrafo diz,

word does undergo quote removal, so \$fff is dequoted to \$fff. But, as the man page says, no variable expansion is done so it stays that way.

    
por 21.05.2015 / 09:52