bash agrega comillas simples adicionales

13

Tengo un problema al ejecutar mi script.
Al ejecutarlo en modo de depuración (bash -x), puedo ver que bash está agregando comillas adicionales. Por eso mi guión está fallando.

Aquí esto está dentro de mi 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}

Esta es la salida:

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"'
usuario2452585
fuente

Respuestas:

8

Bash muestra comillas simples para mostrar un comando que es una sintaxis de entrada válida. No está ejecutando un comando que contiene estas comillas simples en un parámetro para el sshcomando.

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

te dice que los últimos 4 parámetros del comando ssh son "sudo, /home/pi/shared/blink.sh, 27y off".

En el host remoto, el demonio ssh une las palabras de los comandos con espacios como separadores, por lo que el comando remoto que está ejecutando es

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

Esto intenta ejecutar un comando cuyo nombre es sudo /home/pi/shared/blink.sh 27 off, que por supuesto no existe.

Elimine las comillas dobles de su definición de testvar.

Aquí no importa, pero probablemente importa en su caso real: en lugar de ${testvar}escribir "$testvar"(o "${testvar}"si lo desea, pero los corchetes son opcionales). Siempre ponga comillas dobles alrededor de sustituciones variables a menos que sepa por qué necesita dejarlas fuera. "$testvar"se expande al valor de la variable testvar, mientras que $testvarcuando no está entre comillas dobles trata el valor de testvarcomo una lista separada por espacios en blanco de patrones globales.

Gilles 'SO- deja de ser malvado'
fuente
3

Creo que deberías usar:

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}"

Esto es trabajo para mí:

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

Pero si escribo lo mismo que usted, obtengo el mismo resultado incorrecto:

$ bash -x -c 'testvar="\"la la la\""; echo ${testvar}'
+ testvar='"la la la"'
+ echo '"la' la 'la"'
"la la la"
Radu Rădeanu
fuente
Las citas son cruciales porque son el mecanismo del shell para agrupar varias palabras para formar un solo argumento.
Glenn Jackman
2

Shell divide el valor de la variable en palabras. Doble comilla para evitar la división. Ver la diferencia:

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