bash aggiunge virgolette singole extra


13

Ho un problema nell'esecuzione del mio script.
Quando lo eseguo in modalità debug (bash -x), vedo che bash sta aggiungendo virgolette extra. Pertanto la mia sceneggiatura non riesce.

Questo è nel mio copione:

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}

Questo è l'output:

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

Risposte:


8

Bash mostra virgolette singole in modo da mostrare un comando che è una sintassi di input valida. Non esegue un comando che contiene queste virgolette singole in un parametro del sshcomando.

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

si dice che gli ultimi 4 parametri del comando ssh sono "sudo, /home/pi/shared/blink.sh, 27e off".

Sull'host remoto, il demone ssh unisce le parole dei comandi con spazi come separatori, quindi il comando remoto che si sta eseguendo è

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

Questo tenta di eseguire un comando il cui nome è sudo /home/pi/shared/blink.sh 27 off, che ovviamente non esiste.

Rimuovi le doppie virgolette dalla tua definizione di testvar.

Non importa qui, ma probabilmente conta nel tuo caso reale: invece di ${testvar}, scrivi "$testvar"(o "${testvar}"se vuoi ma le parentesi graffe sono opzionali). Metti sempre le virgolette doppie attorno alle sostituzioni variabili a meno che tu non sappia perché devi lasciarle fuori. "$testvar"si espande al valore della variabile testvar, mentre $testvarquando non è racchiuso tra virgolette doppie, il valore viene considerato testvarcome un elenco separato da spazi bianchi di modelli glob.


3

Penso che dovresti usare:

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

Questo funziona per me:

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

Ma se scrivo lo stesso di te, ottengo lo stesso risultato sbagliato:

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

Le virgolette sono cruciali perché sono il meccanismo della shell per raggruppare più parole per formare un singolo argomento.
Glenn Jackman,

2

Shell divide il valore della variabile in parole. Raddoppiarlo per evitare la divisione. Vedi la differenza:

t='"a b c"'
set -xv
echo $t
echo "$t"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.