web-dev-qa-db-fra.com

Utilisation de l'exportation dans .bashrc

J'ai remarqué dans mon .bashrc que certaines lignes ont export devant elles, comme

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

tandis que d'autres ne le font pas, comme

HISTSIZE=100000

Je me demande si, premièrement, c'est correct, et ensuite quelle est la règle pour utiliser export dans .bashrc.

50
Martin Vegter

Vous avez seulement besoin de export pour les variables qui devraient être "vues" par d'autres programmes que vous lancez dans le Shell, tandis que celles qui ne sont utilisées qu'à l'intérieur du Shell lui-même n'ont pas besoin d'être exported .

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.

Cela peut être démontré avec les éléments suivants:

$ 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:

  • J'ai d'abord défini ${MYVAR} pour être une variable Shell avec MYVAR="value". En utilisant echo je peux faire écho de sa valeur car echo fait partie du Shell.
  • Ensuite, je crée echo.sh. C'est un petit script qui fait essentiellement la même chose, il fait juste écho ${MYVAR}, mais la différence est qu'il s'exécutera dans un processus différent car il s'agit d'un script distinct.
  • Lors de l'appel echo.sh il ne produit rien, car le nouveau processus n'hérite pas ${MYVAR}
  • Ensuite, j'exporte ${MYVAR} dans mon environnement avec le mot clé export
  • Quand je lance maintenant le même echo.sh encore une fois, il fait écho au contenu de ${MYVAR} car il provient de l'environnement

Donc, pour répondre à votre question:

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

58
replay

Utilisez export pour variables d'environnement . Les variables d'environnement sont une fonctionnalité du système d'exploitation. Les variables d'environnement sont héritées par les processus enfants: si vous les définissez dans un Shell, elles sont disponibles dans tous les programmes démarré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 courantes:

  • HOME - indique le répertoire personnel de l'utilisateur, où se trouvent les fichiers de configuration par utilisateur. Utilisé par tout programme qui lit les fichiers de configuration par utilisateur ou doit connaître l'emplacement du répertoire personnel 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 dynamique. Utilisé par chaque exécutable lié 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 (c'est-à-dire les programmes GUI).
  • LESS - les options sont automatiquement activées lorsque less est exécuté. Utilisé par less.
  • http_proxy - indique le proxy Web à utiliser. Utilisé par la plupart des navigateurs Web.

N'utilisez pas export pour les variables Shell. Les variables Shell sont une fonctionnalité du Shell en tant que langage de programmation. Les variables du shell sont utilisées uniquement à l'intérieur du shell où elles sont définies; ils n'ont aucun sens 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 Shell. Voici quelques exemples de variables Shell qui ont une signification pour les shells populaires:

  • PS1 - l'invite à afficher avant chaque commande.
  • IFS - les caractères qui séparent les mots dans les extensions de variable sans guillemets et les substitutions de commandes.
  • HISTFILE - un fichier dans lequel le Shell écrira l'historique des commandes.

En plus des variables utilisées par le Shell, la plupart des scripts Shell utilisent des variables à des fins internes.

La plupart des variables d'environnement (par exemple PATH) ont un sens pour une session entière et doivent être définies dans ~/.profile ou un fichier similaire. Variables qui n'ont de sens que pour un shell spécifique (par exemple PS1) doit être défini dans un fichier spécifique à Shell tel que ~/.bashrc ou ~/.zshrc. Voir Existe-t-il un fichier équivalent ".bashrc" lu par tous les shells?

Pour les variables internes bash, vous n'avez pas besoin de export. Dans votre exemple, HISTTIMEFORMAT est utilisé par bash lui-même et n'a pas besoin d'export MYSQL_HISTFILE est pour mysql et doit être exporté sinon mysql ne le voit pas.

3
Zelda