Você deve entender que bashé apenas um ambiente de execução. Ele executa comandos que você chama - não é da conta do shell nem mesmo saber o que o comando faz; você pode chamar qualquer executável que desejar. Na maioria dos casos, ainda não está claro o que um desfazer faria - por exemplo, você pode "desfazer" um filme? Você pode "cancelar o envio" de um email? O que "desfazer a execução do firefox" significaria, por exemplo? Você pode fechá-lo, mas favoritos, downloads e histórico não serão os mesmos.
Se você executar um comando, ele será executado, faça o que fizer. Cabe a você saber o que está fazendo. Observe que isso não significa que comandos individuais não tenham "desfazer" ... eles podem - você pode até escrever uma função de invólucro que faz algo para protegê-lo de erros tolos.
Por exemplo, mvé facilmente reversível apenas movendo o arquivo de volta de onde veio, a menos que você tenha sobrescrito algo. É por isso que o -iswitch existe, para perguntar antes de substituir. Tecnicamente, o inverso de cpé rm, a menos que algo tenha sido sobrescrito (novamente, -ivocê pergunta sobre isso). rmé mais permanente, para tentar recuperar os arquivos, você precisa fazer alguns hackers de nível inferior (existem ferramentas para isso). Se você considerasse o sistema de arquivos como uma caixa preta, tecnicamente não seria possível (apenas os detalhes do layout lógico e físico dos dados permitem que você faça algum controle de danos). rmsignifica que rm, se você quiser a funcionalidade "lixo", isso é apenasmvem algum diretório pré-arranjado (e possivelmente um serviço agendado para mantê-lo ou esvaziá-lo) - nada de especial nele. Mas você pode usar -ipara avisar antes da exclusão. Você pode usar uma função ou um alias para sempre incluir -inesses comandos.
Observe que a maioria dos aplicativos está protegendo você da perda de dados de maneiras diferentes. A maioria (~ todos) dos editores de texto cria arquivos de backup ~no final, caso você queira trazer a versão antiga de volta. Em algumas distros, lsé alternativo por padrão, para ocultá-las ( -B), mas elas estão lá. Muita proteção é dada ao gerenciar as permissões corretamente: não seja root, a menos que seja necessário, torne os arquivos somente leitura se não quiser que eles sejam alterados. Às vezes, é útil ter um ambiente de "sandbox" - você executa as coisas em uma cópia, verifica se está tudo bem e depois mescla as alterações (ou as abandona). chrootou lxcpode impedir que seus scripts escapem de um diretório e causem danos.
Quando você tenta executar coisas em massa - por exemplo, se você possui um comando find complexo, enquanto loop, um pipeline longo ou algo assim, é uma boa ideia primeiro apenas echoos comandos que serão executados. Então, se os comandos parecerem razoáveis, remova echoe execute-o de verdade. E, claro, se você realmente não tem 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 adequado e a descompactação espalha os arquivos, causando uma enorme bagunça). Eu me acostumei a fazer um subdiretório antes de descompactar (eu poderia listar o conteúdo, mas sou preguiçoso). Estou pensando em criar um script que criará um subdiretório somente se o conteúdo tiver sido arquivado sem um subdiretório. Mas quando isso acontece, ls -lrtajuda 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 certa 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 duas vezes o dispositivo que você está formatando e o particionamento está correto antes de executar o comando.