Uma pergunta sobre o uso recomendado de rm e--
Digamos que eu criei dois arquivos -i
e xx
. Se eu tentar removê-los com
$ rm *
Eu recebo:
rm: remove regular file `xx'? n
E, como explicado emComo faço para remover um arquivo no Linux cujo nome parece ser APENAS um hífen, como em "-"e outros, a forma de resolver isso é com:
$ rm -- *
Obviamente os problemas poderiam ser muito piores com nomes chamados -rf
ou similares.
Então minha pergunta é:
Devemos usar sistematicamente comandos
--
inrm
antes de qualquer coisa que seja expansível, para evitar surpresas desagradáveis ou explorações?
A razão pela qual pergunto isso é que há um tempo atrás eu aprendi essa rm
pegadinha e depois esqueci, até recentemente que um colega de equipe a trouxe novamente. Porém nunca vi nenhuma recomendação nesse sentido e sendo tão arriscado, me pergunto se deveríamos ter isso mais presente? O uso de --
algum tipo de script e padrão de console deve ser usado sempre que for usado rm
(e provavelmente outros comandos)?
Responder1
Em um mundo perfeito, acho que sim, deveríamos usar sistematicamente --
. Mas todos nós aprendemos a usar o rm
comando sem digitar sistematicamente --
, e digitá-lo custa três toques extras no teclado, então não vejo isso acontecendo. Além disso, a --
convenção para encerrar opções nem sempre existiu (é por isso que muitas pessoas não aprenderam sobre isso quando aprenderam a usar rm
).
Dito isto, ao usar rm
(e outros comandos) em scripts shell, você definitivamente deve sempre programar defensivamente. Então, por exemplo:
rm "$1" # Remove the file named in the first command line argument
não é seguro e deveria ser rm -- "$1"
. No entanto,
rm "/var/spool/foo/$thatfile"
é seguro, porque o conteúdo de $thatfile
não pode causar rm
má interpretação de seus argumentos.
No seu exemplo específico ( rm *
), eu provavelmente usaria rm ./*
como uma solução alternativa segura.