bash - script - variable d'environnement path linux




Comment lister les variables déclarées dans le script in bash? (7)

Basé sur certaines des réponses ci-dessus, cela a fonctionné pour moi:

before=$(set -o posix; set | sort);

fichier source :

comm -13 <(printf %s "$before") <(set -o posix; set | sort | uniq) 

Dans mon script 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 ceci:

VARIABLE1=abc
VARIABLE2=def
VARIABLE3=ghi

Du point de vue de la sécurité, la answer @ akostadinov ou celle de @ JuvenXu est préférable à l'utilisation du résultat non structuré de la commande set , en raison de la faille de sécurité potentielle suivante:

#!/bin/bash

function doLogic()
{
    local COMMAND="${1}"
    if ( set -o posix; set | grep -q '^PS1=' )
    then
        echo 'Script is interactive'
    else
        echo 'Script is NOT interactive'
    fi
}

doLogic 'hello'   # Script is NOT interactive
doLogic $'\nPS1=' # Script is interactive

La fonction ci-dessus que doLogic utilise set pour vérifier la présence de la variable PS1 afin de 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 totalement contaminer les résultats.

Ceci, bien sûr, représente un risque potentiel pour la sécurité. Au lieu de cela, utilisez soit le support de Bash pour l'expansion du nom de variable indirecte, soit compgen -v .


Essayez d’utiliser un script (appelons-le "ls_vars"):

  #!/bin/bash
  set -a
  env > /tmp/a
  source $1
  env > /tmp/b
  diff /tmp/{a,b} | sed -ne 's/^> //p'

chmod + x it, et:

  ls_vars your-script.sh > vars.files.save

J'ai probablement volé la réponse tout à l'heure ... de toute façon légèrement différente en tant que fonction:

    ##
    # usage source bin/nps-bash-util-funcs
    # doEchoVars
    doEchoVars(){

        # if the tmp dir does not exist
        test -z ${tmp_dir} && \
        export tmp_dir="$(cd "$(dirname $0)/../../.."; pwd)""/dat/log/.tmp.$$" && \
        mkdir -p "$tmp_dir" && \
        ( set -o posix ; set )| sort >"$tmp_dir/.vars.before"


        ( set -o posix ; set ) | sort >"$tmp_dir/.vars.after"
        cmd="$(comm -3 $tmp_dir/.vars.before $tmp_dir/.vars.after | perl -ne 's#\s+##g;print "\n $_ "' )"
        echo -e "$cmd"
    } 

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 bricolage intelligent set -o posix de @ DouglasLeeder:

+ function SOLUTION() { (set +o posix; set) | sed -ne '/^\w\+=/!q; p;'; }

La différence est que cette solution STOPS 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 , la partie sed ... de la solution autorise uniquement les rapports variables (p. Ex. Lignes VAR=VALUE ). En particulier, l’ A2 n’est pas importun dans la sortie.

+ function a() { echo $'\nA2=B'; }; A0=000; A9=999; 
+ SOLUTION | grep '^A[0-9]='
A0=000
A9=999

ET: le problème "DejayClayton" est résolu (les nouvelles lignes incorporées dans les valeurs de variable ne perturbent pas la sortie - chaque VAR=VALUE reçoit une seule ligne de sortie):

+ A1=$'111\nA2=222'; A0=000; A9=999; 
+ SOLUTION | grep '^A[0-9]='
A0=000
A1=$'111\nA2=222'
A9=999

REMARQUE: La solution fournie par @DouglasLeeder souffre du problème "DejayClayton" (valeurs avec des lignes nouvelles incorporées). Ci-dessous, le A1 est faux et A2 ne devrait pas montrer du tout.

$ A1=$'111\nA2=222'; A0=000; A9=999; (set -o posix; set) | grep '^A[0-9]='
A0=000
A1='111
A2=222'
A9=999

FINALEMENT: Je ne pense pas que la version de bash compte, mais elle le pourrait. J'ai fait mes tests / développement sur celui-ci:

$ bash --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-msys)

POST-SCRIPT: Étant donné certaines des autres réponses au PO, je suis convaincu <100% que cet set convertit toujours les nouvelles lignes dans la valeur en \n , sur lesquelles cette solution s'appuie pour éviter le problème "DejayClayton". C'est peut-être un comportement moderne? Ou une variation à la compilation? Ou un shopt option set -o ou shopt ? Si vous connaissez de telles variations, veuillez ajouter un commentaire ...


set affichera les variables, mais malheureusement, les fonctions set seront également affichées.

Heureusement, le mode POSIX n'émet que les variables:

( set -o posix ; set ) | less

Piping to less ou rediriger vers où vous voulez les options.

Donc, pour obtenir les variables déclarées uniquement dans le script:

( set -o posix ; set ) >/tmp/variables.before
source script
( set -o posix ; set ) >/tmp/variables.after
diff /tmp/variables.before /tmp/variables.after
rm /tmp/variables.before /tmp/variables.after

(Ou au moins quelque chose basé sur ça :-))






bash