A solução simples é colocar uma aspa simples ( ' ) no início e outra aspa simples no final e substituir cada caractere ' no nome do arquivo pela sequência de 4 caracteres '\'' . Todos os caracteres perdem seu significado especial dentro de uma string entre aspas simples, exceto ' em si, que marca o final da string. A sequência '\'' termina o literal entre aspas simples, imediatamente seguido por uma aspa simples entre aspas e abre um novo literal com aspas simples. Assim, o nome do arquivo
This file's name has some weird characters!
Will you manage to escape them?
pode ser citado da seguinte forma:
somecommand 'This file'\''s name has some weird characters!
Will you manage to escape them?'
Aspas duplas têm regras de escape mais complexas e não permitem incluir um ponto de exclamação ! se a substituição do histórico estiver ativada, por isso não as considerarei mais.
Uma abordagem alternativa é proteger os caracteres com barras invertidas. Isso funciona para todos os caracteres, exceto novas linhas; para uma nova linha, colocar entre aspas simples (ou aspas duplas) é a única solução. Se você quiser minimizar o número de barras invertidas para apresentar o nome citado ao usuário, você poderá restringi-lo a lugares onde a barra invertida é necessária; no entanto, quanto mais barras invertidas você omite, mais você se arrisca a esquecer o que é necessário. Letras, dígitos e caracteres não-ASCII são sempre ok¹. Cite o espaço em branco e a pontuação sempre que não tiver certeza.
Com um shell típico (ksh, bash ou zsh), você precisa citar os seguintes caracteres em pelo menos algumas circunstâncias.
- Espaço em branco (espaço, tabulação, nova linha - lembrando que as novas linhas não podem ser citadas com uma barra invertida).
-
!- expansão do histórico. -
"- sintaxe da shell. -
#- comentário começa quando precedido por espaço em branco; curingas de zsh. -
$- sintaxe da shell. -
&- sintaxe da shell. -
'- sintaxe da shell. -
(- mesmo no meio de uma palavra: ksh extended globs (também disponível em bash e zsh); curingas de zsh. -
)(consulte() -
*- sh curinga. -
,- apenas dentro da expansão de chaves. -
;- sintaxe da shell. -
<- sintaxe da shell. -
=- em zsh, quando está no início de um nome de arquivo (expansão de nome de arquivo com pesquisa PATH). -
>- sintaxe da shell. -
?- sh curinga. -
[- sh curinga. -
\- sintaxe da shell. -
]- você pode sair sem citá-lo. -
^- expansão do histórico; curinga do zsh. -
'- sintaxe da shell. -
{- expansão de suporte. -
|- sintaxe da shell. -
}- precisa ser escapado em zsh, outras shells são mais tolerantes quando não há chave de abertura correspondente. -
~- expansão do diretório inicial quando está no início de um nome de arquivo; curinga de zsh; sempre seguro quando é o último personagem.
Mais alguns caracteres podem exigir tratamento especial às vezes:
-
-não é especial para o shell, mas quando está no início de um argumento de comando, indica uma opção. Não pode ser protegido por aspas, pois o tratamento especial está no comando, não no shell. Para proteger um nome de arquivo que começa com-, você pode colocar./antes dele - dessa forma, continua sendo o mesmo arquivo, mas o argumento não começa com-mais. -
.não é especial por si só, mas os arquivos de ponto são excluídos de*globs por padrão. -
:não é especial para o shell, mas alguns comandos o analisam especialmente, por exemplo para indicar um arquivo remoto (hostname:filename). Consulte a documentação do comando para ver como lidar com arquivos nams contendo dois pontos.
¹ A menos que o usuário tenha configurado caracteres de expansão de histórico alternativo. Algumas conchas permitem isso. Esse é outro motivo para usar aspas simples em vez de barras invertidas.