Que outros personagens especiais existem?

2

Para nomes de arquivos, sei que você precisa usar aspas duplas ou uma barra invertida para incluir um espaço no nome do arquivo.

Como mkdir "I like coffee" é o mesmo que mkdir I\ like\ coffee

Agora, quando você tenta incluir um $ em seu nome de arquivo, você precisa usar uma barra invertida

Como mkdir \$dollar

Eu me pergunto quais outros caracteres além do espaço e do cifrão que eu tenho que usar caracteres de escape ao nomear meus arquivos?

Eu encontrei o? e o * funciona normalmente, então eu queria saber quais outros personagens são assim.

    
por alkabary 12.08.2015 / 22:03

2 respostas

2

Os nomes de arquivos Unix podem conter qualquer caractere (além de '/' ou '\ 0'), portanto, essa é realmente uma questão de shell; a lista de metacaracteres que precisam de escape depende do shell e da configuração específica do shell. Você parece estar usando bash; outras conchas falharão se o ou * expressões glob são deixadas sem aspas:

$ mkdir test && cd test
$ ls
$ touch *foo
$ ls
*foo
$ exec zsh
% touch *bar
zsh: no matches found: *bar
% ls
*foo
% 
O

bash pode definir a opção de shell failglob para se comportar como zsh a esse respeito. Em geral, cite tudo, ou melhor ainda, não coloque metacaracteres (ou até mesmo espaço) em nomes de arquivos unix, pois esse caminho pode levar a rm -rf chamadas a nuking de árvores de diretório inteiras ou outras falhas aleatórias (um arquivo -i sendo ler como um argumento) ou problemas de segurança no código shell.

    
por 12.08.2015 / 23:58
1

Você não escreveu em qual shell está interessado. O GNU Parallel cita qualquer string em ash bash csh dash fdsh fish fizsh ksh ksh93 mksh pdksh posh rbash rc rush rzsh sash sh static-sh tcsh yash zsh . Cada um deles precisa das cordas citadas de maneira ligeiramente diferente. Para detalhes, veja o 'sub shell_quote_scalar' no link

As linhas principais são:

  • bash-family: s / [\ 002- \ 011 \ 013- \ 032 \ # \? '() {} [] \ ^ * \ < \ = > \ ~ \ | \; \ "! \ $ \ & \ '\ 202- \ 377] / \ $ & / go; s / [\ n] / '\ n' / go
  • csh-family: s / [\ 002- \ 011 \ 013- \ 032 \ # \? '() {} [] \ ^ * \ < \ = > \ ~ \ | \; \ "! \ $ \ & \ '\ 202- \ 377] / \ $ & go / s / [\ n] /" \\ n "/ go
  • rc: s / '/' '/ g; s / [\ n \ 002- \ 011 \ 013- \ 032 \ # \? '() {} [] \ ^ * \ < \ = > \ ~ \ | \; \ "! \ $ \ & \ '\ 202- \ 377] + /' $ & '/ go

Para alguns shells, isso cita mais caracteres do que o necessário para esse shell em particular, mas esses caracteres podem precisar ser citados em outros shells. Por exemplo. '=' que não precisa de citar no bash, mas precisa dele em zsh:

bash$ echo =wc
=wc
zsh% echo =wc
/usr/bin/wc
zsh% echo \=wc
=wc
    
por 13.08.2015 / 08:53