como dividir o comando psql longo no script bash sobre várias linhas

4

Eu tenho um longo comando psql para executar dentro de um script de shell bash, e estou querendo saber qual é a maneira correta de dividi-lo em várias linhas? O caractere de barra invertida padrão 'linha dividida' do script Unix não funciona. Dentro do ambiente postgres, é claro que você poderia continuar linha após linha e o comando não é processado até que você digite o ponto-e-vírgula de fechamento, mas você não o usa dentro de um script de shell.

Meu comando é este:

sudo -u postgres /opt/puppet/bin/psql puppetdb -t -c "select certname, r.value as role, e.value as env from certname_facts r join certname_facts e using (certname) where r.name = 'role' and e.name = 'env' order by role,env,certname" | grep -v "^$" > /home/ansible/inventory_list

Eu não quero alterar o comando, tudo funciona perfeitamente quando digitado manualmente, mas eu preciso saber a maneira correta de fazer isso em uma entrada de linha dividida, algo como:

sudo -u postgres /opt/puppet/bin/psql puppetdb -t
-c "select certname, r.value as role, e.value as env
from certname_facts r join certname_faces e using (certname)
where r.name = 'role' and e.name = 'env'
order by role,env,certname" | grep -v "^$" > /home/ansible/inventory_list

Alguma sugestão, por favor?

    
por HelenH 15.01.2016 / 12:09

2 respostas

4

Nada de errado em dividi-lo com retrocessos como você mostrou. No entanto, geralmente é melhor enviar o SQL via stdin. Para o postgres, isso é especialmente verdadeiro, já que a opção '-c' é corrigida para retornar a saída de apenas um comando, enquanto que ao aceitar comandos do stdin, você pode empilhar quantos comandos desejar. Então, você faria algo como:

sudo -u postgres /opt/puppet/bin/psql puppetdb -t  <<SQL | ...
  select certname, r.value as role, e.value as env
      from certname_facts r join certname_faces e using (certname)
      where r.name = 'role' and e.name = 'env'
      order by role,env,certname
SQL

As variáveis de bash podem ser interpoladas aqui. Para evitar isso, cite a primeira instância de SQL :

sudo -u postgres /opt/puppet/bin/psql puppetdb -t <<'SQL' | ...
    
por 15.01.2016 / 14:07
0

Desculpas, tentei usar o caractere de barra invertida padrão e funcionou, então:

sudo -u postgres /opt/puppet/bin/psql puppetdb -t \
-c "select certname, r.value as role, e.value as env \
from certname_facts r join certname_faces e using (certname) \
where r.name = 'role' and e.name = 'env' \
order by role,env,certname" | grep -v "^$" > /home/ansible/inventory_list

Um colega do DBA me disse que isso não funcionaria, já que é um comando sql e não um comando Unix 'padrão'. Parece que eu deveria ter tentado por mim mesmo antes de acreditar!

    
por 15.01.2016 / 12:26