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
.
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 export
ed .
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:
${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.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.echo.sh
il ne produit rien, car le nouveau processus n'hérite pas ${MYVAR}
${MYVAR}
dans mon environnement avec le mot clé export
echo.sh
encore une fois, il fait écho au contenu de ${MYVAR}
car il provient de l'environnementDonc, pour répondre à votre question:
Cela dépend où une variable va être utilisée, que vous deviez l'exporter ou non.
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.