Às vezes eu uso, $PROJECT_HOME/*
para excluir todos os arquivos do projeto. Quando a variável de ambiente PROJECT_HOME
não está definida (como eu fiz su
e o novo usuário não tem essa variável de ambiente definida), ela começa a excluir todos os arquivos da pasta raiz. Isso é apocalíptico.
Como posso configurar bash
para gerar erro quando uso uma variável de ambiente indefinida no shell?
bash
shell
environment-variables
Comunidade
fonte
fonte
set -u
fará o que você quiser.[ -z "$VAR" ]
trabalha com um não inicializadoVAR
também. A inicialização foi apenas para mostrar o comportamento indesejável - o que quero dizer é que, se seus vars forem inicializados em cadeias vazias, de qualquer maneira, e você continuarrm -r "$PROJECT_HOME"/*
confiando erroneamenteset -u
, obterá o comportamento "apocalíptico". IHMO, é melhor prevenir do que remediar quando se trata de proteger todo o conteúdo do seu computador.set -u
não é seguro.PROJECT_HOME=/etc
? Apenas verificar se há um valor vazio não é suficiente para impedir o cataclismo. Você não deve usar variáveis de usuários não confiáveis ao executar como root.Respostas:
No shell POSIX, você pode usar set -u :
ou usando a expansão de parâmetro :
No seu caso, você deve usar em
:?
vez de?
também falhar em variáveis definidas, mas vazias:fonte
Isso também captura o caso em que
PROJECT_HOME
está definido, mas não contém nada.Exemplo:
1) Isso excluirá praticamente tudo o que você pode excluir em seu sistema (exceto arquivos de ponto dentro
/
(normalmente não existem)):2) Isso não fará nada:
Remover completamente a página inicial do projeto e recriá-la pode ser outra opção (se você também quiser se livrar dos dotfiles):
fonte
-z
está ok, mas como$PROJECT_HOME
deveria ser um diretório, talvez-d
fosse melhor.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
.-d
verificação ocultaria esse erro. Eu acho que é melhor se continuarrm
erm
reclamar sobre isso em voz alta.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
nada fará silenciosamente. Mas[[ -z $PROJECT_HOME ]] || rm -r "$PROJECT_HOME"
excluirá silenciosamente "$ PROJECT_HOME", mesmo que seja um arquivo que não seja um diretório. Receber uma mensagem de erro nunca é um problema:if [[ -d $PROJECT_HOME ]]; then rm -r "$PROJECT_HOME"; else printf '%s is not a directory\n' "$PROJECT_HOME" >&2; fi
PROJECT_HOME="/."
...Outra maneira de fazer isso:
Existem muitas substituições de variáveis, a acima é quando "somevar" está vazio (e, nesse caso, ele tenta excluir
/tmp/or_this_if_somevar_is_empty/*
)fonte
rm -fr ${ENV_VAR:?suitably caustic message here}/*
, mas ainda pode valer a pena verificar que o valor não mapeia para o diretório raiz, observando que há muitas maneiras de subverter testes simples://
,/..
,/usr/who/../..
, ...