No GNU / Linux, nada, exceto / e (ASCII NUL), é permitido como um caractere constituinte válido para o nome do arquivo. Portanto, espaço, tabulação e até nova linha são caracteres constituintes válidos de nome de arquivo. Quando você tem qualquer nome de arquivo, você precisa usar qualquer mecanismo de escape trivial para obter o significado literal do (s) caractere (s). \
Por exemplo, para um nome de arquivo como:
foo bar spam.txt
você pode usar aspas simples, aspas duplas ou foo $bar spam.txt para escapar dos espaços:
'foo bar spam.txt'
"foo bar spam.txt"
foo\ bar\ spam.txt
aspas simples são recomendadas com um nome de arquivo como $bar se você usar aspas duplas, o shell levará $ como uma expansão variável, o mesmo vale para \ sem escape enquanto estiver usando IFS .
Sem escape, o shell executará a divisão de palavras com base nos valores da variável de ambiente * (espaço, guia, nova linha por padrão) e expansão do nome de caminho na string (se houver ? , [] , $file no nome do arquivo).
No caso de uma variável, você precisa duplicar a expansão da variável:
file='foo bar spam.txt'
echo "$file"
O %code% simples cairá novamente na divisão de palavras (e na expansão do nome do caminho).