GNU/Linux >> Tutoriels Linux >  >> Linux

Définir +a n'annule pas l'indicateur -a ?

Sur Mac 10.11.6, en utilisant GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15) le set +a la commande semble ne pas fonctionner :

script.py

#!/usr/bin/python
import os
print("VAR0 is:", os.environ.get("VAR0")

Commandes :

$ VAR0=abc
$ ./script.py
('VAR0 is:', None)   # expected
$ set -a
$ VAR0=abc
$ ./script.py
('VAR0 is:', 'abc')   # expected, VAR0 has been exported to the environment and script.py has access to it
$ set +a
$ VAR0=def
$ ./script.py
('VAR0 is:', 'def')   # <= unexpected

Réponse acceptée :

À emporter :oui, set +a annule set -a mais les variables ne deviennent pas non exportées à cause de cela. Chaque variable doit ensuite être non exportée ou non définie.

L'option allexport (Identique à set -a ) permet l'exportation automatique de nouveau et modifié variables. Variables qui existent avant d'activer le set -a l'option ne sera pas exportée.

Deux points avant de tester :

  1. La condition de set -a peut être imprimé avec shopt -po allexport .
    Et peut être modifié avec shopt -os allexport et shopt -ou allexport .

    $ shopt -po allexport
    set +o allexport
    
    $ set -a
    $ shopt -po allexport
    set -o allexport
    
    $ set +a
    $ shopt -po allexport
    set +o allexport
    
  2. La méthode shell pour tester les variables d'environnement consiste à examiner la sortie de l'environment commande, en fait à grep il

    $ env | grep PATH
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
    

Pas besoin d'un programme externe de python (qui doit être compilé au premier appel). Vous pouvez toujours l'utiliser si cela vous rend heureux, mais ce n'est pas vraiment nécessaire.

Si l'option n'est pas définie (set +a ). Un nouveau la variable ne sera pas être exporté.

$ unset VAR0
$ VAR0=abc
$ env | grep VAR0
                      # nothing is printed.

Ou, si vous voulez toujours votre programme :

$ ./envtest.py
VAR0 is: None

Si le -a l'option est modifiée, la var ne sera pas exportée tant qu'elle n'aura pas été modifiée :

$ set -a
$ shopt -po allexport
set -o allexport
$ env | grep VAR0
$ ./envtest.py
VAR0 is: None

Si la variable change :

$ VAR0=bcd
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd

Mais la variable restera dans l'environnement si le set +a est appliqué :

$ set +a
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd

Même si la variable est modifiée, elle fait toujours partie de l'environnement :

$ VAR0=xyz
$ env | grep VAR0
VAR0=xyz
$ ./envtest.py
VAR0 is: xyz

Jusqu'à ce qu'il soit non exporté (supprimez l'attribut d'exportation) :

$ declare +x VAR0

Ou c'est simplement unset

$ env | grep VAR0
VAR0=xyz
$ unset VAR0
$ env | grep VAR0

Non, attribuer une valeur vide n'est pas la même chose :

$ VAR0=''
$ env | grep VAR0
VAR0=

Ce que votre programme ne montre pas aussi clairement :

$ ./envtest.py
VAR0 is: 

Linux
  1. Le rappel enregistré ne correspond pas à l'URL fournie - Correction de l'erreur WSO2

  2. Pourquoi la méthode suivante ne modifie-t-elle pas la taille limite du fichier principal ?

  3. Où le terme variable d'environnement par défaut est-il défini ?

  4. Pourquoi le fichier de traduction Bash ne contient-il pas tous les textes d'erreur ?

  5. L'émulateur -avd ne lance pas le périphérique virtuel ?

Comment configurer le joli nom d'hôte

Gnome Shell :appuyer sur la super touche ne fonctionne pas ?

La commande Linux sed ne modifie pas le fichier cible

Que fait le '-' (tiret) après les noms de variables ici ?

tmux Ctrl+B ne fonctionne pas

Comment définir un fichier comme NON exécutable ?