bash adiciona aspas simples extras

12

Estou com um problema ao executar meu script.
Ao executá-lo no modo de depuração (bash -x), posso ver que o bash está adicionando aspas extras. Portanto, meu script está falhando.

Aqui está dentro do meu 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 é a saída:

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
fonte

Respostas:

7

O Bash está exibindo aspas simples para mostrar um comando que é uma sintaxe de entrada válida. Não está executando um comando que contém essas aspas simples em um parâmetro para o sshcomando.

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

diz que os últimos 4 parâmetros do comando ssh são "sudo, /home/pi/shared/blink.sh, 27e off".

No host remoto, o daemon ssh une as palavras dos comandos com espaços como separadores; portanto, o comando remoto que você está executando é

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

Isso tenta executar um comando cujo nome é sudo /home/pi/shared/blink.sh 27 off, o que obviamente não existe.

Remova as aspas duplas da sua definição de testvar.

Não importa aqui, mas provavelmente importa no seu caso real: em vez de ${testvar}, escreva "$testvar"(ou "${testvar}"se você quiser, mas o aparelho é opcional). Sempre coloque aspas duplas em torno das substituições de variáveis, a menos que você saiba por que precisa deixá-las de fora. "$testvar"expande para o valor da variável testvar, enquanto que $testvarquando não está entre aspas duplas trata o valor testvarcomo uma lista de padrões glob separados por espaços em branco.

Gilles 'SO- parar de ser mau'
fonte
3

Eu acho que você deve 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}"

Isso está funcionando para mim:

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

Mas se eu escrever da mesma forma que você, obtenho o mesmo resultado errado:

$ bash -x -c 'testvar="\"la la la\""; echo ${testvar}'
+ testvar='"la la la"'
+ echo '"la' la 'la"'
"la la la"
Radu Rădeanu
fonte
As aspas são cruciais porque são o mecanismo do shell para agrupar várias palavras para formar um único argumento.
precisa saber é o seguinte
2

O Shell divide o valor da variável em palavras. Cite duas vezes para evitar a divisão. Veja a diferença:

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