Estou acostumado a usar cat > /path/to/file << EOF
quando eu, em um script bash, imprimi mais de uma linha em um arquivo... Eu estava verificando o código antigo da minha empresa e encontrei a cat EOT
instrução em vez da cat EOF
que estou acostumado (observe o T em vez do F no final) e a curiosidade me mordeu.
Fiz uma pesquisa rápida e só encontrei essa outra pergunta , mas acho que não tinha relação com o que eu queria saber.
Fiz alguns testes com o seguinte código:
password=hello
cat > ./hello.txt << EOT
authentication {
auth_type PASS
auth_pass $password
}
EOT
E recebo exatamente a mesma saída de quando uso EOF
em vez de EOT
. A saída é, como esperado:
root@test_VM:~# bash test.sh && cat hello.txt
authentication {
auth_type PASS
auth_pass hello
}
Então as perguntas são:
- Quais são as diferenças entre o uso de
EOT
eEOF
? - Quando devo usar um sobre o outro?
Não há diferença e nenhum significado particular para essas duas cordas, ou quaisquer outras. É apenas um terminador arbitrário e você pode usar praticamente qualquer string que desejar.
Obviamente, os dados em si não podem conter essa linha específica, portanto, se seus dados contiverem, por exemplo, um script de shell que tenha outro here-doc, você precisará usar terminadores diferentes em ambos. O uso de strings descritivas pode ser útil para futuros leitores do script.
Por exemplo
produz
test.sh
que, quando executado através do shell, imprimehello
.Há uma diferença se você citar o terminador na linha que inicia o here-doc, no entanto, isso impedirá expansões nos dados do here-doc. Isso imprime
$i
, não seja qual for o valor da variável:Veja também:
Deixe-me responder sua segunda pergunta primeiro.
Ou seja, você deve usar o que a diretriz de estilo de codificação do seu projeto exigir - ou, se não houver uma, sua própria preferência consistente .
O editor de código que eu uso gera "EOF" sempre que eu digito os operadores here-doc mesmo que eu pessoalmente prefira "!" que na verdade não é um caractere especial para o shell. (É uma palavra reservada que pode ser usada como delimitador here-doc)
Voltando à primeira pergunta. EOT é na verdade um caractere de controle ASCII que, por convenção em sistemas Unix, gera a indicação End-Of-File para a entrada do terminal de leitura do programa, quando as configurações do terminal não foram alteradas.
Assim, distinguir EOF e EOT pode, de certa forma, significar a finalidade do conteúdo do here-doc, além de delimitar porções sobrepostas de diferentes here-doc.
Finalmente. Essa outra pergunta que você vinculou pediu uma explicação por que EOF tem um valor diferente de EOT. E, como explicado, EOF é uma condição , enquanto EOT é um valor e caractere de byte válido, e EOF é gerado por um caractere EOT nas configurações padrão do terminal.