Não é incomum passar pelo problema de tentar apagar um arquivo cujo nome começa com o caracter ‘-‘, como no exemplo abaixo:
Não adianta proteger a string pois não é o Shell que atrapalha a ação, e sim o próprio programa que reconhece o símbolo - de uma forma diferente. O programa rm aceita, alem de uma lista de arquivos para apagar, uma série de opções que modificam o seu funcionamento. As mais comuns são:
As opções normalmente pode ser colocadas em qualquer lugar da lista de parâmetros.
Quem avalia os parâmetros normalmente é uma função chamada getopt (presente em várias linguagens, inclusive no Bash). Bom, vimos que o - é um caracter especial para o getopt, mas existe alguma forma de burlar isso?
Sim! O proprio getopt prove essa funcionalidade: o uso dos simbolos ‘–’. Eles interrompem a expansão de parâmetros e tudo o que vier depois desses dois caracteres será interpretado literalmente pelo programa.
Assim sendo:
Esta dica está no help do comando rm e vale para todos os programas que usem getopts.
$ rm -arquivo.txt
rm: invalid option -- a
Não adianta proteger a string pois não é o Shell que atrapalha a ação, e sim o próprio programa que reconhece o símbolo - de uma forma diferente. O programa rm aceita, alem de uma lista de arquivos para apagar, uma série de opções que modificam o seu funcionamento. As mais comuns são:
-f ignore nonexistent files, never prompt
-i prompt before any removal
-r remove the contents of directories recursively
-v explain what is being done
As opções normalmente pode ser colocadas em qualquer lugar da lista de parâmetros.
$ rm -v a.out
removed `a.out'
$ rm a.out -v
removed `a.out'
Quem avalia os parâmetros normalmente é uma função chamada getopt (presente em várias linguagens, inclusive no Bash). Bom, vimos que o - é um caracter especial para o getopt, mas existe alguma forma de burlar isso?
Sim! O proprio getopt prove essa funcionalidade: o uso dos simbolos ‘–’. Eles interrompem a expansão de parâmetros e tudo o que vier depois desses dois caracteres será interpretado literalmente pelo programa.
Assim sendo:
$ rm -v -- -arquivo.txt
removed `-arquivo.txt'
Esta dica está no help do comando rm e vale para todos os programas que usem getopts.
Nunca caí nessa do arquivo começado com sinal de menos, não por ser mais esperto que os outros, mas porque sou uma traça de manual. =)
Basta um man rm para resolver o problema (foi o que fiz na primeira vez em que me deparei com um arquivo desses).
Mas sabia que existe um livro que muitos chamam de «A Bíblia Negra do Hacker» (creio que a alcunha correta seria «o livreto negro de bolso do lammer»)? Esse livro apresenta a questão do «ataque» (ó! pretenção) onde o «atacante» (uf!) usa :> para criar arquivos começando com sinal de menos, cuja única forma de resolver o problema, segundo o livro, é mover todos os demais arquivos para outro diretório e apagar (argh!) o diretório onde estão os arquivos maliciosos.
É de se escangalhar de rir… um verdadeiro livreto de piadas sujas.
[]’s
Cacilhas