Emita um erro ao usar variáveis de shell vazias

18

Às vezes eu uso, $PROJECT_HOME/* para excluir todos os arquivos no projeto. Quando a variável de ambiente, PROJECT_HOME não está definida (porque eu fiz su e o novo usuário não tem esse conjunto de variáveis de ambiente), ele inicia a exclusão de todos os arquivos da pasta raiz. Isso é apocalíptico.

Como posso configurar bash para lançar erro quando uso uma variável de ambiente indefinida no shell?

    
por Madhavan Kumar 08.06.2015 / 08:24

3 respostas

25

No shell POSIX, você pode usar set -u :

#!/bin/sh

set -u
: "${UNSET_VAR}"

ou usando a Expansão do parâmetro :

: "${UNSET_VAR?Unset variable}"

No seu caso, você deve usar :? em vez de ? para também falhar em variáveis definidas, mas vazias:

rm -rf -- "${PROJECT_HOME:?PROJECT_HOME empty or unset}"/*
    
por 08.06.2015 / 08:33
18
[ -z "$PROJECT_HOME" ] || rm -r "$PROJECT_HOME"/*

Isso também captura o caso em que PROJECT_HOME está definido, mas não contém nada.

Exemplo:

1) Isto irá deletar praticamente tudo que você pode deletar em seu sistema (exceto arquivos de pontos dentro de / (geralmente não há nenhum)):

set -u
PROJECT_HOME=
rm -r "$PROJECT_HOME"/*

2) Isso não fará nada:

PROJECT_HOME=
[ -z "$PROJECT_HOME" ] || rm -r "$PROJECT_HOME"/* 

Completamente removendo seu projeto para casa e recriando-o pode ser outra opção (se você quiser se livrar de dotfiles também):

#no apocalyptic threats in this scenario
rm -r "$PROJECT_HOME"
mkdir "$_" 
    
por 08.06.2015 / 08:38
0

Outra maneira de fazer isso:

rm -r "${somevar:-/tmp/or_this_if_somevar_is_empty}"/*

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/* )

    
por 08.06.2015 / 09:59