Quais caracteres precisam ser escapados em arquivos sem aspas?

5

Eu tenho shell / terminal baseado em navegador que executa comandos bash e estou escapando de espaços, mas acontece que os parênteses também precisam ser escapados. Quais outros caracteres precisam ser escapados para nomes de arquivos que não estão entre aspas?

    
por jcubic 24.02.2017 / 15:12

1 resposta

11

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.

    
por 09.04.2017 / 14:27