bash ajoute des guillemets simples supplémentaires

13

J'ai un problème lors de l'exécution de mon script.
Lors de son exécution en mode débogage (bash -x), je peux voir que bash ajoute des guillemets supplémentaires. C'est pourquoi mon script échoue.

Voici ceci dans mon script:

testvar="\"sudo /home/pi/shared/blink.sh 27 off\""
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 ${testvar}

Voici la sortie:

ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 192.168.42.105 '"sudo' /home/pi/shared/blink.sh 27 'off"'
user2452585
la source

Réponses:

8

Bash affiche des guillemets simples afin d'afficher une commande qui est une syntaxe d'entrée valide. Il n'exécute pas une commande qui contient ces guillemets simples dans un paramètre de la sshcommande.

ssh  '"sudo' /home/pi/shared/blink.sh 27 'off"'

vous dit que les 4 derniers paramètres de la commande ssh sont "sudo, /home/pi/shared/blink.sh, 27et off".

Sur l'hôte distant, le démon ssh joint les mots des commandes avec des espaces comme séparateurs, de sorte que la commande à distance que vous exécutez est

"sudo /home/pi/shared/blink.sh 27 off"

Cela tente d'exécuter une commande dont le nom est sudo /home/pi/shared/blink.sh 27 off, qui bien sûr n'existe pas.

Supprimez les guillemets doubles de votre définition de testvar.

Cela n'a pas d'importance ici, mais cela a probablement de l'importance dans votre cas réel: au lieu de ${testvar}, écrivez "$testvar"(ou "${testvar}"si vous voulez, mais les accolades sont facultatives). Mettez toujours des guillemets doubles autour des substitutions de variables, sauf si vous savez pourquoi vous devez les laisser de côté. "$testvar"se développe à la valeur de la variable testvar, alors que $testvarlorsqu'il n'est pas entre guillemets traite la valeur de testvarcomme une liste de motifs glob séparés par des espaces.

Gilles 'SO- arrête d'être méchant'
la source
3

Je pense que vous devriez utiliser:

testvar="sudo /home/pi/shared/blink.sh 27 off"
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 "${testvar}"

Cela fonctionne pour moi:

$ bash -x -c 'testvar="la la la"; echo "${testvar}"'
+ testvar='la la la'
+ echo 'la la la'
la la la

Mais si j'écris la même chose que vous, j'obtiens le même mauvais résultat:

$ bash -x -c 'testvar="\"la la la\""; echo ${testvar}'
+ testvar='"la la la"'
+ echo '"la' la 'la"'
"la la la"
Radu Rădeanu
la source
Les citations sont cruciales car elles sont le mécanisme du shell pour regrouper plusieurs mots pour former un seul argument.
glenn jackman
2

Shell divise la valeur de la variable en mots. Citez-le deux fois pour éviter le fractionnement. Regarde la différence:

t='"a b c"'
set -xv
echo $t
echo "$t"
choroba
la source