2017-09-29 9 views
2

Bonjour J'ai un problème avec une ligne très spécifique dans un script bash. Voici le code:requête mysql à l'intérieur de la chaîne bash -c échappée. Comment mettre des citations?

ssh $SOURCEIP "/usr/bin/time -f \"%e\" bash -c \"seq $ITER | parallel -n0 \"mysql --silent -h $TARGET -uroot -ppass -e 'SELECT * FROM dbname.tablename WHERE size = $SIZE;' >> out.txt\"" 

Le problème est que je suis sorti de citations. Les doubles guillemets d'ouverture et d'échappement au début de "mysql" ferment ceux de "bash -c". Je dois mettre l'instruction mysql entre guillemets et la requête entre guillemets simples, sinon j'obtiens une erreur et je n'arrive pas à comprendre comment procéder. Je sais que je ne devrais pas passer le mot de passe comme ça et il sera changé plus tard, je reçois cet avertissement "$ ITER" - fois que je le tester car --silent ne supprime pas cela. Le code problématique fait partie d'un petit script shell censé effectuer ce transfert de données. Je veux passer à l'autre machine avec ssh en premier et non via parallel en raison de la cohérence avec d'autres scripts. Donc, j'ai besoin des guillemets autour de la commande bash -c pour que toute cette opération parallèle fonctionne, qui est déjà échappée à cause des doubles-quotes ssh d'ouverture et je dois aussi mettre la commande mysql entre guillemets, mais ils se ferment en quelque sorte.

Toute aide sera grandement appréciée. Merci d'avance. Largio

Edit: (SOLUTION) Comme suggéré par @ ole-Tange la commande suivante a fonctionné pour moi.

parallel --shellquote | parallel --shellquote 

Après avoir invoqué dans une coquille, je collais ma chaîne en question dans l'invite et a obtenu la chaîne masquée en arrière. J'ai toujours eu des problèmes pour savoir exactement quoi coller mais à la fin c'est juste logique. Qu'est-ce exactement que je collais dans le quoter était:

sql mysql://root:[email protected]$TARGET/ 'SELECT data FROM db_name.tablename WHERE size = ${SIZE};' >> out.txt 

Mais j'eu quelques problèmes avec mes variables dans ma requête. Le problème ici était que je devais masquer le masquage des 2 variables $ TARGET et $ SIZE après que tout ait été masqué par le quotient parallèle. Peut-être que ma façon de penser est trop laborieuse, mais je n'arrivais pas à la faire fonctionner autrement. Notez également que je n'ai pas mis de guillemets autour de l'ensemble de la déclaration sql, comme mon plan l'était auparavant, parce que maintenant le quotier compensait cela. Pour des raisons de cohérence i coller la chaîne finale que je suis travailler à la fin (avec mes changements par la suite):

ssh $SOURCEIP "/usr/bin/time -f \"%e\" bash -c \"seq $ITER | parallel -n0 sql\\\ mysql://root:[email protected]$TARGET/ \\\'SELECT\\\ data\\\ FROM\\\ db_name.tablename\\\ WHERE\\\ size\\\ =\\\ ${SIZE}\\\;\\\'\\\ \\\>\\\>\\\ out.txt\"" 

Répondre

0

parallèle GNU a un quoter:

$ parallel --shellquote 
"*\`$ 
[CTRL-D] 
\"\*\\\`\$ 

Et vous pouvez le faire deux fois:

$ parallel --shellquote | parallel --shellquote 
"*\`$ 
[CTRL-D] 
\\\"\\\*\\\\\\\`\\\$ 

Il suffit donc de coller la chaîne que vous voulez citer.

Mais vous voudrez peut-être envisager d'utiliser les fonctions et utiliser env_parallel pour copier la fonction:

myfunc() { 
    size=$1 
    target=$2 

    sql mysql://root:[email protected]$target/ "SELECT data FROM db_name.tablename WHERE size = $size;" >> out.txt 
} 
env_parallel --env myfunc -S $SOURCEIP --nonall myfunc $SIZE $TARGET 

également: Au lieu de mysql essayer sql mysql://root:[email protected]/ 'SELECT * FROM dbname.tablename WHERE size = $SIZE;'

+0

Ce moment où vous connaissez le nom de quelqu'un parce que vous l'a cité dans votre mémoire de master parce que vous utilisez son logiciel et que ce gars répond à votre question sur le débordement de la pile. Incroyable. Merci beaucoup M. @OleTange. – Largio