Como foi apontado, as duas variáveis drt
e pma
não estavam presentes no ambiente do seu script, o que significa que o shell as expandiu para strings vazias. O comando resultante foi rm -rf /*
(com *
expandido para o que estava disponível no diretório raiz).
O próprio diretório raiz não será removido executando rm -rf /*
como root. Além disso, eu (e Jesse_b que apontou para mim) estou um pouco confuso com a mensagem de erro
bash: cd /: No such file or directory
A única maneira de provocar essa mensagem de erro é executar o comando "cd /"
(observe as aspas). Se /
foi realmente removido, a mensagem de erro seria
bash: cd: /: No such file or directory
isaac já deu algumas dicas sobre como evitar que você faça coisas como essa no futuro, mas Eu pensei que eu iria apenas entrar com meus conselhos.
- Não trabalhe em um prompt do shell de root.
- Se estiver escrevendo scripts que exigem permissões de root, use
sudo
no script dos comandos específicos que realmente exigem essas permissões elevadas. Não execute o script inteiro como root, especialmente durante o desenvolvimento. - Você geralmente não precisa tocar em
/etc/bash.bashrc
por qualquer motivo e nunca deve precisar explicitamente obtê-lo. Variáveis de ambiente podem ser criadas- do usuário
$HOME/.bashrc
(se o script for executado a partir de uma sessão interativa) ou - no próprio script ou
- em um arquivo separado (escrito para o script) originado pelo script explicitamente ou
- em um arquivo apontado pela variável de ambiente
BASH_ENV
.
- do usuário
Outra medida de segurança que salvou você nesse caso é executar o script em set -u
( nounset
) e possivelmente também em set -e
( errexit
). A opção nounset
shell ameaçará a expansão de uma variável não definida como um erro, enquanto a opção errexit
shell sairá da sessão do shell imediatamente se um comando sair com um status de saída diferente de zero.
O script
#!/bin/bash -ue
echo "$hello"
echo "world"
nunca produzirá world
, mas, em vez disso, provocará a mensagem
script.sh: line 3: hello: unbound variable
antes de terminar. (É o -u
que faz a finalização, -e
is não faz nada neste exemplo simples ).