Utiliser export dans .bashrc

45

J'ai remarqué dans mon .bashrcque certaines lignes ont exportdevant eux, tels que

export HISTTIMEFORMAT="%b-%d  %H:%M  "
...
export MYSQL_HISTFILE="/root/.mysql_history"

alors que d'autres non, comme

HISTSIZE=100000

Je me demande si, d' abord, cela est correct, et la seconde ce que la règle est pour l' utilisation exportdans .bashrc.

Martin Vegter
la source

Réponses:

53

Vous n'avez besoin que exportde variables qui doivent être "vues" par d'autres programmes que vous lancez dans le shell, alors que celles qui ne sont utilisées que dans le shell lui-même n'ont pas besoin d'être exportéditées.

Voici ce que dit la page de manuel:

The  supplied  names are marked for automatic export to the environ‐
ment of subsequently executed commands.  If the -f option is  given,
the  names  refer to functions.  If no names are given, or if the -p
option is supplied, a list of all names that are  exported  in  this
shell  is  printed.   The -n option causes the export property to be
removed from each name.  If a variable name is  followed  by  =word,
the  value  of  the variable is set to word.  export returns an exit
status of 0 unless an invalid option  is  encountered,  one  of  the
names  is  not a valid shell variable name, or -f is supplied with a
name that is not a function.

Ceci peut être démontré avec ce qui suit:

$ MYVAR="value"
$ echo ${MYVAR}
value
$ echo 'echo ${MYVAR}' > echo.sh
$ chmod +x echo.sh
$ ./echo.sh

$ export MYVAR="value-exported"
$ ./echo.sh
value-exported

Explication:

  • Je me suis d'abord mis ${MYVAR}à être une variable Shell avec MYVAR="value". En utilisant echoje peux en faire écho car echo fait partie de la coque.
  • Puis je crée echo.sh. C'est un petit script qui fait fondamentalement la même chose, cela résonne ${MYVAR}, mais la différence est qu'il s'exécutera dans un processus différent car il s'agit d'un script séparé.
  • Lorsque l'appelant echo.shne génère rien, car le nouveau processus n'hérite pas${MYVAR}
  • J'exporte ensuite ${MYVAR}dans mon environnement avec le exportmot clé
  • Lorsque je lance à echo.shnouveau la même chose , cela rappelle le contenu de ${MYVAR}parce qu’il provient de l’environnement

Donc, pour répondre à votre question:

Cela dépend où une variable va être utilisée, si vous devez l'exporter ou non.

rejouer
la source
17

Utiliser exportpour les variables d'environnement . Les variables d'environnement sont une fonctionnalité du système d'exploitation. Les processus enfants héritent des variables d'environnement: si vous les définissez dans un shell, elles sont disponibles dans tous les programmes lancés par ce shell. Les variables utilisées par de nombreuses applications ou par des applications spécifiques autres que les shells sont des variables d'environnement. Voici quelques exemples de variables d'environnement communes:

  • HOME- indique le répertoire de base de l'utilisateur, où se trouvent les fichiers de configuration par utilisateur. Utilisé par tout programme lisant des fichiers de configuration par utilisateur ou ayant besoin de connaître l'emplacement du répertoire de base de l'utilisateur.
  • PATH- indique où trouver les fichiers exécutables pour lancer d'autres programmes. Utilisé par tous les programmes qui doivent démarrer un autre programme.
  • LD_LIBRARY_PATH- indique où trouver les fichiers de bibliothèque dynamiques. Utilisé par tous les exécutables liés dynamiquement.
  • EDITOR, VISUAL- indique le programme à exécuter lorsqu'un éditeur est nécessaire. Utilisé par tout programme devant lancer un éditeur de texte.
  • DISPLAY, XAUTHORITY- indique comment se connecter au serveur X11. Utilisé par les clients X11 (programmes graphiques).
  • LESS- les options automatiquement activées lors de l' lessexécution. Utilisé par less.
  • http_proxy- indique le proxy Web à utiliser. Utilisé par la plupart des navigateurs Web.

Ne pas utiliser exportpour les variables shell. Les variables shell sont une fonctionnalité du shell en tant que langage de programmation. Les variables shell ne sont utilisées qu'à l'intérieur du shell où elles sont définies. ils n'ont aucune signification pour les programmes lancés par le shell. Les variables shell sont dupliquées lors de la création d'un sous-shell, comme le reste de l'état du shell. Voici quelques exemples de variables de shell ayant une signification pour les shell populaires:

  • PS1 - l'invite à afficher avant chaque commande.
  • IFS - les caractères qui séparent les mots dans les extensions de variable non citées et les substitutions de commandes.
  • HISTFILE - un fichier où le shell écrira l'historique des commandes.

Outre les variables utilisées par le shell, la plupart des scripts utilisent des variables pour leurs besoins internes.

La plupart des variables d'environnement (par exemple PATH) ont un sens pour toute une session et doivent être définies dans ~/.profileun fichier similaire. Les variables qui n'ont de sens que pour un shell spécifique (par exemple PS1) doivent être définies dans un fichier spécifique au shell, tel que ~/.bashrcou ~/.zshrc. Voir Y at-il un fichier équivalent ".bashrc" lu par tous les shells?

Gilles, arrête de faire le mal
la source
3

Pour les variables internes bash, vous n'avez pas besoin export. De votre exemple HISTTIMEFORMATest utilisé par bash lui-même et n'a pas besoin d'une exportation MYSQL_HISTFILEpour mysqlet que l'exportation a besoin sinon mysqlne le voit pas.

Zelda
la source