Pour certaines sessions shell, je veux pouvoir imprimer un indicateur d'avertissement si une variable shell n'est pas définie et exportée.
Il est assez simple de faire quelque chose comme ça pour imprimer "Erreur" dans l'invite si SET_ME
est non défini ou nul.
test_var () { test -z "$1" && echo Error; }
PS1='$(test_var "$SET_ME") \$ '
Cependant, cela ne parvient pas à marquer si j'ai défini SET_ME
sans l'exporter, ce qui est une erreur que je veux pouvoir détecter. À court de quelque chose comme $(bash -c 'test -z "$SET_ME" && echo Error;')
ou de saluer la sortie de export
, y a-t-il une simple vérification que je peux faire pour tester si elle SET_ME
a été exportée?
Une solution non POSIX, bash uniquement est tout à fait acceptable.
bash
environment-variables
CB Bailey
la source
la source
typeset
attributs.-z "$1"
suppose que je passe la valeur d'une variable àtest_var
(comme je l'étais) alors qu'elledeclare -p
attend son nom. Je suis venu avec ce test qui prend le nom d'une variable de shell:test_exported_notnull () { re='^declare -\w*x'; [[ -n $(eval echo \$$1) ]] && [[ $(declare -p "$1") =~ $re ]]; }
.eval
, ajoutez simplement cette première ligne:,var=$1
puis utilisez[[ -z "${!var}" ]] && echo Error
.Je sais que la question a 3 ans, mais on peut trouver la solution suivante plus simple:
répond, si la variable est exportée et a une valeur non vide.
la source
Dans Bash 4.4 ou version ultérieure , vous pouvez utiliser l'
${parameter@a}
expansion des paramètres du shell pour obtenir une liste des attributs d'un paramètre, y compris s'il est exporté.Voici une fonction simple démontrant
${parameter@a}
, qui vous dira si une variable donnée est exportée, compte tenu de son nom:Exemple d'utilisation:
Comment ça fonctionne:
Le format renvoyé par
${parameter@a}
est d'un caractère par attribut, avec la signification de chaque caractère d'attribut provenant des options correspondantes de la commande declare - dans ce cas, nous voulons rechercherx
- exporté.la source
Vous pouvez utiliser
compgen
avec son-X
option pour déterminer si une variable est exportée:Par exemple:
la source
Si je me résigne à devoir utiliser
export
etgrep
, le test le plus simple est probablement quelque chose comme ça.ou si je veux aussi non nul:
la source
export
n'est pas spécifié et définit un format précis pourexport -p
similaire à bashexport
mais différent. Mais bash semble ignorer POSIX et utiliser le même format queexport
pourexport -p
!La
export
commande, donnée sans paramètres, donne une liste des noms exportés dans l'environnement actuel:Quelques coupures et sédiments se débarrassent des peluches:
Voici votre liste d'exportations, prête pour un traitement ultérieur.
la source
export
") car mon utilisation prévue est dans mon invite.export
, et c'est la seule chose que j'ai trouvée. Aucune aide du shell ne s'échappe non plus. Leexport
est intégré de toute façon, mais je doute que vous puissiez éviter legrep
.La méthode la plus simple à laquelle je pense actuellement:
la source