Citando: loop sobre ssh-accounts, chame psql no servidor remoto

2

Isso funciona no cérebro humano, mas o shell erra citando:

for h in a b; do ssh $h psql -tAc "select * from mytab where mycol='x'"; done

Como citar este forro sem perder a legibilidade?

    
por guettli 16.04.2015 / 15:30

1 resposta

1

Você precisa escapar das citações. Pense neles como camadas de embrulho, em um jogo de passar o pacote. Cada shell desembrulha uma 'camada'.

Então:

echo "this ; is a semicolon"

Mas se você quiser rodar via ssh:

ssh $user@$host echo "this ; is a semicolon"

O ssh desdobraria a primeira camada do pacote - enviando:

echo this ; is a semicolon

O qual quebraria, porque os ponto-e-vírgulas são interpretados pelo shell.

Então, para fazer isso, você precisa escapar primeiro das aspas - assim, o ssh pode 'desembrulhar' uma camada com segurança:

ssh $user@$host echo "\"this ; is a semicolon\""

ssh irá assim remover a camada 'externa' e 'escapar' e passar:

echo "this ; is a semicolon"

Isto será o que você precisa fazer para o seu forro. Quanto a não perder a legibilidade - é mais fácil falar do que fazer, tenho medo, pois as fugas e o aninhamento de cotas inevitavelmente ficam confusas.

O melhor que posso oferecer é usar uma variável para encapsular sua instrução SQL, para que fique claro que você está enviando uma instrução 'encapsulada:

THING_TO_ECHO='"this ; is a semicolon"'; ssh $user@host echo $THING_TO_ECHO
    
por 16.04.2015 / 16:25

Tags