Como o shell irá expandir uma inclusão em um here-doc?

3

Eu tenho um caso de lógica de shell trançado para enviar a você, já que eu não encontrei nada nesse ponto específico em qualquer lugar (por favor, aceite minhas desculpas se eu perdi isso). Vou tentar explicar o contexto da melhor maneira possível.

Eu tenho um primeiro scriptA , que eu espero gerar um segundo scriptB através do uso de um heredoc. Há dois itens que eu quero ter neste heredoc: um my_source file include e algumas variáveis locais para scriptA (para expansão dentro de scriptA , isto é). Aqui está um exemplo:

scriptA:

#!/bin/sh
logfile=/path/to/my_logfile
scriptB=/path/to/my_script
cat > ${scriptB} << __EOF__
  . /path/to/my_source  #this is a shell script
  echo "Some text" | tee -a ${logfile}
__EOF__

Minha pergunta sobre o snippet acima é: a expansão do shell na instrução . (ou seja, a inclusão de my_source ) ocorre em scriptA ou em scriptB ?

Bônus: é possível especificar de alguma forma que alguma parte do documento aqui não deve ser expandida?

Nota: Eu tentei ser compatível com POSIX aqui e evitar especificidades de bash

Obrigado pelos insights!

EDIT: A resposta é que o utilitário . não será acionado no aqui-doc em scriptA . Isso ocorre porque o aqui-doc só executa:

parameter expansion, command substitution, and arithmetic expansion

O . é um utilitário interno especial do shell, que não é expandido (assim como todos os built-ins do shell, incluindo built-ins específicos do bash, ksh, tcsh (...)). / p>

Obrigado @ilkkachu pelo insight.

    
por Meeshkah 30.03.2017 / 11:30

2 respostas

1

Não, um aqui-doc é expandido principalmente como uma string com aspas duplas :

If no part of word is quoted, all lines of the here-document shall be expanded for parameter expansion, command substitution, and arithmetic expansion.

As barras invertidas também funcionam para escapar de caracteres especiais.

A nota sobre citar significa que algo como <<"EOF" impediria a expansão de qualquer coisa dentro do aqui-doc. No seu exemplo, a referência a ${logfile} seria expandida pelo shell antes de passar a entrada para cat .

Você ainda pode usar a substituição de comando se quiser incluir a saída de um comando, mas, se tudo o que você quer é que usar um pipe também seria uma escolha lógica.

    
por 30.03.2017 / 11:56
1

O heredoc não faz reinterpretações, ou pode-se dizer, não executa nenhum comando dentro dele. Apenas interpola strings.

Portanto, a resposta à sua consulta é que source -ing não acontecerá dentro do heredoc.

Quanto a este último, você pode usar \ , ou seja, barras invertidas para DESLIGAR o significado dos caracteres que você não deseja expandir pelo heredoc.

    
por 30.03.2017 / 11:38