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.