Você deve entender que bash
é apenas um ambiente de execução. Ele executa os comandos que você chama - não é da responsabilidade do shell saber o que o comando faz, você pode chamar qualquer executável que desejar. Na maioria dos casos, nem fica claro o que um desfazer faria - por exemplo, você pode "não jogar" um filme? Você pode "cancelar" um e-mail? O que "desfazer o firefox em execução" significaria, por exemplo? Você pode fechá-lo, mas os favoritos, os downloads e o histórico não serão os mesmos.
Se você executar um comando, ele será executado, o que acontecer. Cabe a você saber o que está fazendo. Note que isto não significa que comandos individuais não tenham "desfazer" ... eles podem - você pode até mesmo escrever uma função de invólucro que faz algo para protegê-lo de erros tolos.
Por exemplo, mv
é facilmente reversível movendo apenas o arquivo de onde veio, a menos que você tenha sobrescrito algo. É por isso que existe -i
switch, para perguntar antes de sobrescrever. Tecnicamente, o inverso de cp
é rm
, a menos que algo seja sobrescrito (novamente, -i
pergunta a você sobre isso). rm
é mais permanente, para tentar recuperar os arquivos, você precisa fazer alguns hacks de baixo nível (existem ferramentas para isso). Se você considerasse o sistema de arquivos como uma caixa preta, tecnicamente não seria possível (somente os detalhes do layout físico e lógico dos dados permitem que você faça algum controle de danos). rm
significa rm
, se você quiser a funcionalidade "lixeira", isso é apenas mv
em algum diretório pré-arranjado (e possivelmente um serviço agendado para manter ou esvaziar) - nada especial sobre isso. Mas você pode usar -i
para avisar antes da exclusão. Você pode usar uma função ou um alias para sempre incluir -i
nesses comandos.
Observe que a maioria dos aplicativos protege você da perda de dados de diferentes maneiras. A maioria (todos) dos editores de texto cria arquivos de backup com ~
no final, caso você queira trazer a versão antiga de volta. Em algumas distros, ls
é alias por padrão para que as oculte ( -B
), mas elas estão lá. É dada muita proteção gerenciando permissões corretamente: não seja root a menos que seja necessário, torne os arquivos somente leitura se você não quiser que eles sejam alterados. Às vezes é útil ter um ambiente de "sandbox" - você executa coisas em uma cópia, vê se está tudo bem, e então mescla as mudanças (ou abandona as mudanças). chroot
ou lxc
pode impedir que seus scripts escapem de um diretório e causem danos.
Quando você tenta executar coisas em massa - por exemplo, se você tem um comando find complexo, while loop, um longo pipeline, ou qualquer coisa assim, é uma boa idéia primeiro echo
os comandos que serão obtidos executado. Então, se os comandos parecerem razoáveis, remova echo
e execute-o para real. E, claro, se você não tiver certeza do que está fazendo, faça uma cópia primeiro. Às vezes, apenas crio um tarball do diretório atual.
Falando de tarballs - tarbombs e zipbombs são bastante comuns infelizmente (quando as pessoas fazem um arquivo sem um subdiretório apropriado, e descompactar espalha os arquivos ao redor, fazendo uma bagunça enorme). Eu me acostumei a apenas fazer um subdiretório antes de descompactar (eu poderia listar o conteúdo, mas eu sou preguiçoso). Estou pensando em criar um script que criará um subdiretório somente se o conteúdo for arquivado sem um subdiretório. Mas quando isso acontece, ls -lrt
ajuda a encontrar os arquivos mais recentes para colocar onde eles pertencem. Eu apenas dei isso como um exemplo - um programa pode ter muitos efeitos colaterais que o shell não tem como saber (Como poderia? É um programa diferente sendo chamado!) A única maneira segura de evitar erros é ter cuidado (pense duas vezes, execute uma vez).
Possivelmente os comandos mais perigosos são os que lidam com o sistema de arquivos: mkfs, fdisk / gdisk e assim por diante. Eles podem destruir completamente o sistema de arquivos (embora com o software forense adequado, pelo menos a engenharia reversa parcial seja possível). Sempre verifique novamente o dispositivo que você está formatando e o particionamento está correto, antes de executar o comando.