Por que devo usar abas em vez de espaços em heredocs? [duplicado]

0

Eu pessoalmente trabalho em plataforma cruzada com Windows e Linux e às vezes edito .sh arquivos com o Notepad ++. É, portanto, problemático para mim manter todos os recuos de guias de meus arquivos como Unix-like, então minha solução foi usar recuo baseado em espaço.

No entanto, eu encontro problema ao recuar rebanhos dentro heredocs. Por exemplo, aqui está um heredoc externo, segurando um gato interno heredoc:

bash /dev/fd/10 10<<-'EOT'
    Some command.
    cat << EMW >> /etc/apache2/apache2.conf
    EMW
    Some other command.
EOT

Como eu me lembrei, eu corri isso com sucesso com o estilo Unix no bash, mas não com o Windows, como o script quebrou e o mesmo aconteceu com o uso de espaços.

Minha pergunta:

A minha pergunta pode ser composta por estas questões e peço não só a mim, mas a outras pessoas curiosas que o encontrem:

  1. Por que não podemos usar espaços para recuar comandos e heredocs dentro de outros heredocs?
  2. Se eu estiver errado e houver uma solução alternativa para permitir espaço recuando para comandos e heredocs dentro de outros heredocs, do que o que é isso?
por JohnDoea 22.03.2017 / 19:18

1 resposta

2

Em primeiro lugar, não existe uma tabulação do tipo Unix ou uma tabulação do tipo Windows. Um caractere de tabulação é o mesmo no Windows e no Unix. O que pode mudar entre editores de texto (não entre sistemas operacionais) é 1. o que acontece quando você pressiona a tecla TAB ou 2. quantos espaços são exibidos quando o editor encontra um caractere de tabulação no código-fonte. Uma regra é definir recuo para o que você gosta (em número de espaços) e manter o tabulação para 8, mas este é outro debate.

Agora, voltemos ao seu código. O problema é o delimitador EMW. Com esta sintaxe sua, a linha EMW não pode ser recuada (seja com espaços ou TABs), deve estar no início de uma linha. Além disso, perde seu status de delimitador heredoc.

Então, uma solução poderia ser:

bash /dev/fd/10 10<<'EOT'
    Some command.
    cat << EMW >> /etc/apache2/apache2.conf
....
....
EMW
    Some other command.
EOT

Note também que o conteúdo de apache2.conf (simbolizado acima com .... ) não deve ser indentado, ou seria recuado em apache2.conf também.

Se você quiser recuar todo o código bash, use esta sintaxe:

bash /dev/fd/10 10<<-'EOT'
        Some command.
        cat << EMW >> /etc/apache2/apache2.conf
        ....
        ....
        EMW
        Some other command.
EOT

Aqui, o espaço inicial usado para recuo é composto de qualquer número do caractere TAB (TAB, não espaço!)

O que eu mudei? Eu mudei 10<<'EOT' para 10<<-'EOT' . Essa sintaxe especial pede ao bash para descartar qualquer caractere TAB principal ao analisar um heredoc. O delimitador EMW pode ser recuado, assim como o conteúdo de apache2.conf .

    
por 22.03.2017 / 19:51