terça-feira, 12 de junho de 2007

Um Caracter Inconveniente

Não é incomum passar pelo problema de tentar apagar um arquivo cujo nome começa com o caracter '-', como no exemplo abaixo:

$ 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.

Um comentário:

La Batalema Pitonisto disse...

É Tiago,

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