Dans mon script en bash, il y a beaucoup de variables, et je dois faire quelque chose pour les enregistrer dans un fichier. Ma question est de savoir comment lister toutes les variables déclarées dans mon script et obtenir une liste comme celle-ci:
VARIABLE1=abc
VARIABLE2=def
VARIABLE3=ghi
-o posix
now a diff ne contiendra que les variables.VARS="`set -o posix ; set`"; source script; SCRIPT_VARS="`grep -vFe "$VARS" <<<"$(set -o posix ; set)" | grep -v ^VARS=`"; unset VARS;
. Cela produira également les variables dans un format prêt à enregistrer. La liste comprendra les variables que le script a modifiées (cela dépend si cela est souhaitable)source
, vous devriez pouvoir le faire avec la sortie dedeclare -p
.before=$(set -o posix; set); dosomestuff; diff <(echo "$before") <(set -o posix; set)
Il répertorie toutes les variables, y compris les variables locales. Je l'ai appris grâce à Get list of variables dont le nom correspond à un certain modèle et je l' ai utilisé dans mon script .
la source
compgen -v
répertorie également les variables globales non définies localement. Je ne sais pas si c'est un bug de longue date ou le comportement souhaité.Cela doit afficher tous les noms de variables shell. Vous pouvez obtenir une liste avant et après le sourcing de votre fichier, tout comme avec "set" pour différencier les variables nouvelles (comme expliqué dans les autres réponses). Mais gardez à l'esprit qu'un tel filtrage avec diff peut filtrer certaines variables dont vous avez besoin mais qui étaient présentes avant de sourcer votre fichier.
Dans votre cas, si vous savez que les noms de vos variables commencent par "VARIABLE", alors vous pouvez rechercher votre script et faire:
MISE À JOUR: Pour une solution pure BASH (aucune commande externe utilisée):
la source
eval "printf '%q\n' $(printf ' "${!%s@}"' _ {a..z} {A..Z})"
Sur la base de certaines des réponses ci-dessus, cela a fonctionné pour moi:
fichier source :
la source
Si vous pouvez effectuer un post-traitement (comme déjà mentionné), vous pouvez simplement placer un
set
appel au début et à la fin de votre script (chacun dans un fichier différent) et faire une comparaison sur les deux fichiers. Sachez que cela contiendra encore du bruit.Vous pouvez également le faire par programme. Pour limiter la sortie à votre portée actuelle, vous devrez implémenter un wrapper pour la création de variables. Par exemple
Quels rendements
la source
Voici quelque chose de similaire à la réponse @GinkgoFr, mais sans les problèmes identifiés par @Tino ou @DejayClayton, et est plus robuste que le
set -o posix
peu intelligent de @ DouglasLeeder :La différence est que cette solution S'ARRÊTE après le premier rapport non variable, par exemple la première fonction rapportée par
set
BTW: Le problème "Tino" est résolu. Même si POSIX est désactivé et que les fonctions sont signalées par
set
, lased ...
partie de la solution autorise uniquement les rapports de variables via (par exemple, desVAR=VALUE
lignes). En particulier, leA2
ne le fait pas indûment dans la sortie.ET: Le problème "DejayClayton" est résolu (les retours à la ligne intégrés dans les valeurs des variables ne perturbent pas la sortie - chacun
VAR=VALUE
obtient une seule ligne de sortie):NOTE: La solution fournie par @DouglasLeeder souffre du problème "DejayClayton" (valeurs avec retours à la ligne incorporés). Ci-dessous, le
A1
est faux etA2
ne devrait pas du tout apparaître.ENFIN: je ne pense pas que la version des
bash
choses compte, mais ça pourrait. J'ai fait mes tests / développement sur celui-ci:POST-SCRIPT: Compte tenu de certaines des autres réponses à l'OP, je suis sûr à <100% que cela convertit
set
toujours les nouvelles lignes dans la valeur en\n
, sur laquelle cette solution s'appuie pour éviter le problème "DejayClayton". C'est peut-être un comportement moderne? Ou une variation au moment de la compilation? Ou un paramètreset -o
ou uneshopt
option? Si vous connaissez de telles variations, veuillez ajouter un commentaire ...la source
Essayez d'utiliser un script (appelons-le "ls_vars"):
chmod + x it, et:
la source
Du point de vue de la sécurité, que ce soit @ akostadinov de réponse ou @ JuvenXu de réponse est préférable de compter sur la sortie non structurée de la
set
commande, en raison de la faille de sécurité potentielle:La fonction ci-dessus
doLogic
utiliseset
pour vérifier la présence d'une variablePS1
pour déterminer si le script est interactif ou non (peu importe si c'est le meilleur moyen d'atteindre cet objectif; ce n'est qu'un exemple.)Cependant, la sortie de
set
n'est pas structurée, ce qui signifie que toute variable contenant une nouvelle ligne peut contaminer totalement les résultats.Ceci, bien sûr, est un risque de sécurité potentiel. Au lieu de cela, utilisez soit la prise en charge de Bash pour l'extension de nom de variable indirecte, soit
compgen -v
.la source
Essayez ceci:
set | egrep "^\w+="
(avec ou sans la| less
tuyauterie)La première solution proposée
( set -o posix ; set ) | less
, fonctionne mais présente un inconvénient: elle transmet les codes de contrôle au terminal, de sorte qu'ils ne s'affichent pas correctement. Ainsi, par exemple, s'il y a (probablement) uneIFS=$' \t\n'
variable, nous pouvons voir:…au lieu.
Ma
egrep
solution affiche correctement cela (et éventuellement d'autres similaires) .la source
bash -c $'a() { echo "\nA=B"; }; unset A; set | egrep "^\w+="' | grep ^A
afficheA=B"
-> Échec!J'ai probablement volé la réponse il y a quelque temps ... de toute façon légèrement différent en tant que fonction:
la source
La
printenv
commande:printenv
imprime toutenvironment variables
avec leurs valeurs.Bonne chance...
la source
Un moyen simple de le faire est d'utiliser le mode strict de bash en définissant des variables d'environnement système avant d'exécuter votre script et d'utiliser diff pour trier uniquement celles de votre script:
Vous pouvez maintenant récupérer les variables de votre script dans /tmp/script_vars.log. Ou du moins quelque chose basé sur ça!
la source
Un peu tard à la fête, mais voici une autre suggestion:
La ligne de commande du pipeline diff + sed génère toutes les variables définies par le script dans le format souhaité (comme spécifié dans l'article de l'OP):
la source