Eu precisava escrever um script para inserir entrada de várias linhas em um programa ( psql
).
Depois de pesquisar um pouco, descobri que a seguinte sintaxe funciona:
cat << EOF | psql ---params
BEGIN;
`pg_dump ----something`
update table .... statement ...;
END;
EOF
Isso constrói corretamente a sequência de linhas múltiplas (de BEGIN;
para END;
, inclusive) e a canaliza como uma entrada para psql
.
Mas não tenho ideia de como / por que funciona, alguém pode explicar?
Estou me referindo principalmente a cat << EOF
, eu sei >
saídas para um arquivo, >>
anexa a um arquivo, <
lê as entradas do arquivo.
O que <<
exatamente faz?
E existe uma página de manual para isso?
cat
. Tentepsql ... << EOF ...
Consulte também "aqui strings". mywiki.wooledge.org/BashGuide/InputAndOutput?#Here_Stringscat
lê stding (quando canalizada para ele) ou lê um arquivo que lhe corresponde de argumentos de linha de comandoRespostas:
Isso é chamado de formato heredoc para fornecer uma string no stdin. Veja https://en.wikipedia.org/wiki/Here_document#Unix_shells para mais detalhes.
De
man bash
:fonte
<<-
, observe que apenas os caracteres de tabulação iniciais são removidos - não os caracteres de tabulação flexível. Esse é um daqueles casos raros em que você realmente precisa do caractere de tabulação. Se o restante do documento usar guias flexíveis, certifique-se de mostrar caracteres invisíveis e (por exemplo) copiar e colar um caractere de tabulação. Se você fizer certo, o realce da sintaxe deve capturar corretamente o delimitador final.A
cat <<EOF
sintaxe é muito útil ao trabalhar com texto de várias linhas no Bash, por exemplo. ao atribuir uma sequência de linhas múltiplas a uma variável de shell, arquivo ou canal.Exemplos de
cat <<EOF
uso de sintaxe no Bash:1. Atribua seqüência de várias linhas a uma variável de shell
A
$sql
variável agora também contém os caracteres de nova linha. Você pode verificar comecho -e "$sql"
.2. Passe uma string de várias linhas para um arquivo no Bash
O
print.sh
arquivo agora contém:3. Passe a sequência de linhas múltiplas para um tubo no Bash
O
b.txt
arquivo contémbar
ebaz
linhas. A mesma saída é impressa parastdout
.fonte
No seu caso, "EOF" é conhecido como "Aqui Tag".
<<Here
Diz basicamente ao shell que você inserirá uma sequência de linhas múltiplas até a "tag"Here
. Você pode nomear essa tag como desejar, geralmente éEOF
ouSTOP
.Algumas regras sobre as tags Here:
exemplo:
fonte
<<-
usado, a guia inicial não impedirá que a tag seja reconhecida #POSIX 7
kennytm citado
man bash
, mas a maior parte disso também é POSIX 7: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04 :Exemplos
Alguns exemplos ainda não dados.
As cotações impedem a expansão de parâmetros
Sem aspas:
Resultado:
Entre aspas:
ou (feio, mas válido):
Saídas:
O hífen remove as guias principais
Sem hífen:
onde
<tab>
está uma guia literal e pode ser inserido comCtrl + V <tab>
Resultado:
Com hífen:
Resultado:
Isso existe, é claro, para que você possa recuar seu
cat
código semelhante, que é mais fácil de ler e manter. Por exemplo:Infelizmente, isso não funciona para caracteres de espaço: o POSIX favoreceu o
tab
recuo aqui. Caramba.fonte
<<-
e<tab>a
, note-se que o objetivo era permitir a indentação normal de código no script, enquanto permitia que o texto heredoc apresentado ao processo de recebimento iniciasse na coluna 0. É um recurso pouco comumente visto e um pouco mais contexto pode impedir uma boa dose de cabeça coçar ...$
"$a"'$b'"$c"
, mas não há analógico aqui no AFAIK.Usando tee em vez de gato
Não é exatamente uma resposta à pergunta original, mas eu queria compartilhar isso de qualquer maneira: eu precisava criar um arquivo de configuração em um diretório que exigisse direitos de root.
O seguinte não funciona para esse caso:
porque o redirecionamento é tratado fora do contexto do sudo.
Acabei usando isso:
fonte
Uma pequena extensão para as respostas acima. O final
>
direciona a entrada para o arquivo, substituindo o conteúdo existente. No entanto, um uso particularmente conveniente é a seta dupla>>
anexada, adicionando seu novo conteúdo ao final do arquivo, como em:Isso prolonga a sua situação
fstab
sem que você precise se preocupar em modificar acidentalmente qualquer conteúdo.fonte
Isso não é necessariamente uma resposta para a pergunta original, mas um compartilhamento de alguns resultados dos meus próprios testes. Este:
produzirá o mesmo arquivo que:
Portanto, não vejo o objetivo de usar o comando cat.
fonte
<<test
semcat <<test
.Vale a pena notar que aqui os documentos também funcionam em loops de festa. Este exemplo mostra como obter a lista de colunas da tabela:
ou mesmo sem a nova linha
fonte