Normalement, nous pouvons source le ~/.bashrc
fichier en utilisant cette commande
source ~/.bashrc
mais si j'écris ceci dans un script shell et l'exécute, rien ne se passe. Pourquoi?
Est-ce qu'il y a un moyen de faire ça?
Mon script:
#!/bin/bash
chmod a+x ~/.bashrc
source ~/.bashrc
Aussi essayé .
(point) au lieu de source
. Même résultat.
source ~/.bashrc
le shell dont vous souhaitez modifier l'environnement. Vous ne pouvez pas le changer d'un autre processus. Peut-être que (globalement) l'ajout de cet alias pourrait faire partie du processus d'installation de votre interface graphique.Votre
.bashrc
commence habituellement:Étant donné que votre script n'a pas défini PS1 (car il n'est pas interactif), il ne réinitialise pas le chemin car il se ferme tôt. Pour démontrer, modifiez votre script:
cela permettra maintenant à vos scripts de fonctionner avec le nouveau
.bashrc
. Remarque: une fois votre script terminé, env sera défini sur ce qu'il était avant de démarrer le script. Les modifications seront répercutées au prochain démarrage d’un terminal.la source
.bashrc
utilise un moyen plus fiable de vérifier que le shell est interactif./etc/bash.bashrc
a toujours le test PS1.Essayer:
Cela devrait recharger ~ / .bashrc, ~ / .bash_aliases, etc.
la source
source
mais détruit toutes les variables et que l'utilisateur a définies manuellement - ce qui peut être ou ne pas être ce que vous voulez.exec bash
, la façon dont je le comprends commande après restera dans les mêmes paramètres bash qu'auparavant?Je veux compléter la réponse de Ravi :
Ce comportement est spécifique à Ubuntu (et probablement à la plupart des distributions dérivées), car votre
~/.bashrc
fichier par défaut commence par un court-circuit, Ubuntu 18.04, par exemple:Cela arrêtera l'évaluation du fichier s'il est exécuté dans un shell non interactif, ce qui est le cas de votre script, car tous les scripts sont exécutés dans un shell non interactif , et par la suite tous les fichiers dont vous
source
hériterez.eval
piraterJ'ai découvert un vilain bidouillage pour contourner spécifiquement Ubuntu, en utilisant à la
eval
place desource
:Il saute simplement les quelques premières lignes et évalue le reste
~/.bashrc
afin que le reste soit évalué et modifie l'exécution en cours.Sachez qu’il s’agit d’un nombre magique qui pourrait ne pas fonctionner avec toutes les versions d’Ubuntu; mais peut être une bonne solution si vous construisez des scripts pour des systèmes plus ou moins connus.
Une solution plus sophistiquée pourrait impliquer l’utilisation de regex pour cibler les bits spécifiques qui arrêtent l’évaluation.
Alternative Shebang
Une autre alternative qui pourrait mieux fonctionner dans certains scénarios consiste à forcer le script à s'exécuter dans un shell interactif en ajoutant un indicateur dans le shebang :
Soyez conscient de certaines choses:
#!/usr/bin/env bash
formulaire, mais de cette manière, vous ne pouvez pas démarrer le shell avec des arguments .-i
a ses propres conséquences, parmi lesquelles les programmes inviteront les utilisateurs à interagir, ce qui n'est généralement pas destiné aux scripts. Par exemple, l'installation dedeb
packages peut arrêter le script à l'dpkg configure
invite .set -i
etset +i
d'activer et de désactiver la fonctionnalité là où j'en avais besoin, mais cela ne fonctionne pas .la source
Aucune des autres méthodes ne fonctionnait pour moi [
source /path/to/file
vs. ./path/to/file
, alias, etc ...], jusqu'à ce que, grâce à ce tutoriel, j'ai découvert que:#!/usr/bin/env bash
caseau lieu du plus simple,
#!/usr/bin/env
on laisse les arguments à l’interprète, ce qui est la clé ici - voir ce document pour plus d’informations.En tout état de cause, si les commandes de source, sous quelque forme que ce soit, ne fonctionnent pas pour vous, essayez de vérifier votre shebang, c'est peut-être le problème :)
la source