Parfois, j'utilise $PROJECT_HOME/*
pour supprimer tous les fichiers du projet. Lorsque la variable d'environnement PROJECT_HOME
n'est pas définie (car je l'ai fait su
et que le nouvel utilisateur n'a pas cette variable d'environnement définie), elle commence à supprimer tous les fichiers du dossier racine. C'est apocalyptique.
Comment puis-je configurer bash
pour générer une erreur, lorsque j'utilise une variable d'environnement non définie dans le shell?
bash
shell
environment-variables
Communauté
la source
la source
set -u
fera ce que vous voulez.[ -z "$VAR" ]
fonctionne également avec un fichier non initialiséVAR
. L'initialisation était juste pour montrer le comportement indésirable - Mon point est, si jamais vos vars sont initialisés à des chaînes vides, de quelque manière que ce soit, et que vous exécutez àrm -r "$PROJECT_HOME"/*
tort en vous appuyant surset -u
, vous obtiendrez le comportement «apocalyptique». IHMO, il vaut mieux prévenir que guérir lorsqu'il s'agit de protéger l'intégralité du contenu de votre ordinateur.set -u
n'est pas sûr.PROJECT_HOME=/etc
? Il ne suffit pas de vérifier une valeur vide pour éviter un cataclysme. Vous ne devez pas utiliser de variables d'utilisateurs non fiables lors de l'exécution en tant que root.Réponses:
Dans le shell POSIX, vous pouvez utiliser set -u :
ou en utilisant l' extension des paramètres :
Dans votre cas, vous devez utiliser
:?
au lieu de?
également échouer sur des variables définies mais vides:la source
Cela interceptera également le cas où
PROJECT_HOME
est défini mais ne contient rien.Exemple:
1) Cela supprimera à peu près tout ce que vous pouvez supprimer sur votre système (sauf les fichiers dot à l'intérieur
/
(il n'y en a généralement pas)):2) Cela ne fera rien:
Supprimer complètement la maison de votre projet et le recréer pourrait être une autre option (si vous souhaitez vous débarrasser des fichiers dot aussi):
la source
-z
est ok, mais comme il$PROJECT_HOME
est censé être un répertoire, ce-d
serait peut -être mieux.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
.-d
chèque cacherait cette erreur. Je pense que c'est mieux si cela continuerm
etrm
s'en plaint à voix haute.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
ne fera rien, en silence. Mais[[ -z $PROJECT_HOME ]] || rm -r "$PROJECT_HOME"
supprimera silencieusement "$ PROJECT_HOME", même s'il s'agit d'un fichier qui n'est pas un répertoire. Obtenir un message d'erreur n'est jamais un problème:if [[ -d $PROJECT_HOME ]]; then rm -r "$PROJECT_HOME"; else printf '%s is not a directory\n' "$PROJECT_HOME" >&2; fi
PROJECT_HOME="/."
...Une autre façon de procéder:
Il existe de nombreuses substitutions de variables, celle ci-dessus est lorsque "somevar" est vide (et dans ce cas, il tente de supprimer
/tmp/or_this_if_somevar_is_empty/*
)la source
rm -fr ${ENV_VAR:?suitably caustic message here}/*
, mais il pourrait encore vérifier la valeur que la valeur ne correspond pas au répertoire racine, faisant remarquer qu'il ya plusieurs façons de subvertir tests simples://
,/..
,/usr/who/../..
, ...