Adicione um par extra de aspas, portanto, há uma para o shell local e outra para o shell remoto , em que ssh
é executado.
$ dir=/tmp; file="foo bar";
$ ssh somewhere ls -l "'$dir/$file'"
-rw-r--r-- 1 foo foo 4194304 Oct 19 18:05 /tmp/foo bar
$ ssh somewhere [[ -f "'$dir/$file'" ]] ; echo $?
0
Você deseja as aspas duplas no exterior para que o shell local expanda as variáveis antes que o comando ssh
seja executado. Com uma aspa simples no interior, o shell remoto não expandirá mais os caracteres especiais.
A menos que o nome do arquivo contenha aspas simples, isto é. Nesse caso, você terá problemas.
Para contornar isso, você precisará de algo que adicione as fugas necessárias à string. Alguns sistemas têm printf "%q"
, novas versões do Bash têm a ${var@Q}
expansão que deve fazer algo semelhante semelhante.
$ dir=/tmp; file="\$foo' bar"
$ fullpath="$(printf "%q" "$dir/$file")"
$ ssh somewhere ls -l "$fullpath"
-rw-r--r-- 1 foo foo 0 Oct 19 18:45 /tmp/$foo' bar