Comment recharger .bashrc sans me déconnecter et se reconnecter?


Réponses:


2638

Il vous suffit de saisir la commande:

source ~/.bashrc

ou vous pouvez utiliser la version plus courte de la commande:

. ~/.bashrc

88
Ce n'est pas exactement la même chose que la connexion et la déconnexion. Supposons que vous disposiez de la ligne suivante dans .bashrc:, export PATH=$PATH:foopuis modifiez-la en export PATH=$PATH:bar. Si vous vous connectez et vous déconnectez, seul barsera dans le CHEMIN, mais si vous faites ce que vous suggérez, les deux fooet barseront dans le CHEMIN. Connaissez-vous un moyen de contourner cela?
HighCommander4

7
@ HighCommander4 - une façon très insatisfaisante de faire ce que vous voulez est de faire "bash -l" mais cela crée en fait un nouveau sous-shell et lorsque vous vous déconnectez, vous reviendrez au shell englobant où "foo" est toujours dans PATH. Si vous êtes juste intéressé par PATH, vous pouvez faire "unset PATH" et le reconstruire à partir de zéro, mais probablement plus facile / plus sûr est de faire "PATH = / bin: / usr / bin" avant de vous procurer votre .bashrc. La façon dont la variable PATH est construite lors de la connexion est en fait assez complexe, impliquant au moins une entrée à partir de la connexion (voir "connexion man") et / etc / profile (voir "man bash").
George Hawkins

2
@Alex vous pouvez l'automatiser en ajoutant la ligne ~ / .bashrc dans ~ / .bash_profile, mais je ne sais pas si c'est une bonne pratique.
Vivek Gani

4
Je recommanderais également de créer un alias (que vous pourriez stocker dans ~ / .bashrc ou ~ / .bash_aliases) qui ouvre .bashrc et le recharge après la fermeture de l'éditeur. Vous pouvez le faire en combinant deux commandes dans un alias, par exemple comme si (si vim est votre éditeur préféré, sinon échanger sur à autre chose): alias editbashrc='vim ~/.bashrc; source ~/.bashrc'. Cela rendra l'édition beaucoup plus fluide, car vous n'avez pas besoin de penser au rechargement, après avoir effectué l'édition, si vous utilisez l'alias personnalisé.
Samuel Lampa

6
Cela n'affectera que le terminal actuel.
matepal297

284

Ou vous pouvez utiliser:

exec bash

Cela fait la même chose et est plus facile à retenir (du moins pour moi).

La execcommande remplace complètement le processus shell en exécutant la ligne de commande spécifiée. Dans notre exemple, il remplace tout ce que le shell actuel est par une nouvelle instance de bash(avec les fichiers de configuration mis à jour).


13
Pourriez-vous expliquer la différence de source .bashrccommandement et exec bash?
muradin

18
@muradin, sourceest une commande shell intégrée qui exécute le contenu du fichier passé en argument, dans le shell courant . Ainsi, dans votre exemple, il exécute le fichier .bashrc dans le shell actuel. Et la execcommande remplace le shell par un programme donné, dans votre exemple, elle remplace votre shell par bash (avec les fichiers de configuration mis à jour)
WhoSayIn

3
Dans ma circonstance hyper-spécifique, cela a totalement basculé. Mon Dockerfile exécute un script d'installation qui modifie .bashrc. J'ai ensuite besoin de cela pour recharger, mais . ~/.bashrcje l'exécuterai dashplutôt que bash, donc il y a une erreur car elle shoptest manquante. sourcen'est pas trouvée dans le shell, donc cette solution est également sortie. J'ai essayé cela et l'image docker s'est bien construite!
m59

9
Élégant, mais "fait la même chose" n'est pas tout à fait correct. source ~/.bashrcpréservera l' intégralité de votre environnement shell (bien que probablement modifié par le sourcing de ~/.bashrc), tandis que exec bashne conservera que les variables d'environnement de votre shell actuel (toute modification ad hoc du shell actuel en termes de variables de shell, de fonction, d'options est perdue). Selon vos besoins, l'une ou l'autre approche peut être préférée.
mklement0

12
@SEoF, quand vous dites "bash inception" et si vous pensez à ce que je pense que vous pensez, je dois dire que vous vous trompez. Contrairement au film, vous ne continuez pas à passer de bash à bash lorsque vous le faites à plusieurs reprises exec bash. La execcommande remplace le shell par le programme, dans notre cas, bash. Ainsi, il existe toujours une instance de bash dans le terminal.
John Red

121

Pour compléter et contraster les deux réponses les plus populaires, . ~/.bashrcet exec bash:

Les deux solutions se rechargent efficacement~/.bashrc , mais il existe des différences:

  • . ~/.bashrcou source ~/.bashrcva préserver votre shell courant :

    • À l'exception des modifications apportées par le rechargement ~/.bashrcdans le shell actuel ( sourcing ), le shell actuel et son état sont préservés , ce qui inclut les variables d'environnement, les variables du shell, les options du shell, les fonctions du shell et l'historique des commandes.
  • exec bash, ou, de façon plus robuste, exec "$BASH"[1] , remplacera votre shell actuel par une nouvelle instance, et ne conservera donc que les variables d'environnement de votre shell actuel (y compris celles que vous avez définies ad hoc).

    • En d'autres termes: toute modification ad hoc du shell actuel en termes de variables de shell, fonctions de shell, options de shell, historique des commandes est perdue.

Selon vos besoins, l'une ou l'autre approche peut être préférée.


[1] exec bashpourrait en théorie exécuter un exécutable différent bash de celui qui a démarré le shell courant, s'il se trouve dans un répertoire répertorié plus haut dans le $PATH. Étant donné que la variable spéciale $BASHcontient toujours le chemin complet de l'exécutable qui a démarré le shell actuel, il exec "$BASH"est garanti d'utiliser le même exécutable.
Une note re "..."autour $BASH: des guillemets doubles assure que la valeur de la variable est utilisée en l' état , sans interprétation par Bash; si la valeur n'a pas d'espaces incorporés ou d'autres métacaractères de shell (ce qui n'est probablement pas dans ce cas), vous n'avez pas strictement besoin de guillemets doubles, mais leur utilisation est une bonne habitude pour se former.


Vous avez répondu à ma question avant de pouvoir la poser. C'est bon à savoir; Je règle souvent mon CLASSPATH pour une seule session.
swinefish

Donc, même si j'appelle exec "$ BASH", les variables définies par .bashrc seront-elles trouvées dans le shell que j'ouvrirai ensuite (en utilisant le même exécutable que ma session actuelle)?
nitinr708

3
@ nitinr708: Oui, exec $BASHsera source ~/.bashrc, donc vous verrez ses changements dans l'environnement shell dans la nouvelle session.
mklement0

@ Gaming32, j'apprécie l'idée d'une note de bas de page hyper-liée, mais cela n'a pas vraiment fonctionné (et dans une réponse aussi courte que celle-ci, ce n'est pas si important).
mklement0

44

Quelqu'un a modifié ma réponse pour ajouter un anglais incorrect, mais voici l'original, qui est inférieur à la réponse acceptée.

. .bashrc

25
Cela ne fonctionnera que si votre répertoire actuel est en fait votre répertoire personnel. Les éléments suivants fonctionneront:. ~ / .bashrc
Brian Showalter

6
Qu'est-ce qui fait que ça marche? Que se passe-t-il réellement lorsque je fais ".bashrc"? Merci!
Jed Daniels

54
. est un raccourci BASH pour la commande intégrée "source". Ainsi, ".bashrc" est identique à "source .bashrc" pour l'interpréteur BASH.
Brian Showalter

7
Cool. Merci. Maintenant que je ne savais pas.
Jed Daniels

2
Je viens de soumettre une demande de modification à ajouter ~/, mais comme la réponse du haut montre les deux source ~/.bashrcet . ~/.bashrcje me demande si cette réponse doit être supprimée car redondante.
Max Ghenis

18

Selon votre environnement, il suffit de taper

bash

peut également fonctionner.


15
Cependant, cela invoquera un nouveau shell au sein de l'actuel, gaspillant ainsi des ressources. Mieux vaut utiliser la solution exec de @ WhoSayln qui remplace le shell actuel par celui nouvellement appelé.
Bernhard Wagner

oui, utilisez simplement la source. C'est totalement inutile et ennuyeux.
dylnmc

En plus du commentaire de @ BernhardWagner, vous perdez également votre historique actuel de bash si vous générez un nouveau shell
peterchaula

C'est une bonne solution où l'accès aux privilèges des utilisateurs est limité.
Tunde Pizzle

l'invocation d'un sous-processus ajoute une couche de complexité qui n'a pas de valeur supplémentaire.
Alan Berezin

18

Avec ça, vous ne même pas à taper "source ~ / .bashrc":

Incluez votre fichier bashrc:

alias rc="vim ~/.bashrc && source ~/.bashrc"

Chaque fois que vous souhaitez modifier votre bashrc, lancez simplement l'alias " rc "


15
. ~/.bashrc

. est un module intégré mandaté par POSIX


Alternatives

source ~/.bashrc

sourceest un synonyme de point / période .dans bash, mais pas dans POSIX sh, donc pour une compatibilité maximale, utilisez le point.

exec bash
  • execcommande remplace le shell par un programme donné ... - WhoSayIn

2
exec bashhérite toujours de l'environnement du shell actuel. exec env -i bashserait plus proche (ou exec env -i bash -lsi vous êtes actuellement dans un shell de connexion).
chepner

5

Selon votre environnement, vous souhaiterez peut-être ajouter des scripts pour que .bashrc se charge automatiquement lorsque vous ouvrez une session SSH. J'ai récemment effectué une migration vers un serveur exécutant Ubuntu, et là, .profile, pas .bashrc ou .bash_profile est chargé par défaut. Pour exécuter des scripts dans .bashrc, j'ai dû exécuter source ~/.bashrcchaque fois qu'une session était ouverte, ce qui n'aide pas lors de l'exécution de déploiements à distance.

Pour que votre .bashrc se charge automatiquement lors de l'ouverture d'une session, essayez de l'ajouter au .profile:

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Rouvrez votre session et elle devrait charger tous les chemins / scripts que vous avez dans .bashrc.


J'ai ceci dans ".profile" mais ça ne marche pas - chaque fois que je quitte, je dois le faire à la main. Aucune suggestion?
Wayne Smallman

4

J'ai utilisé easyengine pour configurer mon serveur basé sur le cloud vultr.
J'ai trouvé mon fichier bash sur /etc/bash.bashrc.

Le source /etc/bash.bashrctruc pour moi aussi!

mise à jour

Lors de la configuration d'un serveur nu (ubuntu 16.04), vous pouvez utiliser les informations ci-dessus, lorsque vous n'avez pas encore configuré de nom d'utilisateur et que vous vous connectez via root.

Il est préférable de créer un utilisateur (avec les privilèges sudo) et de se connecter en tant que nom d'utilisateur à la place.
Cela créera un répertoire pour vos paramètres, y compris les fichiers .profile et .bashrc.
https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/

Maintenant, vous allez éditer et (et "source") le ~/.bashrcfichier.

Sur mon serveur, il était situé à /home/your_username/.bashrc
(où se your_usernametrouve en fait le nouveau nom d'utilisateur que vous avez créé ci-dessus, et connectez-vous maintenant avec)


4

exec bash est un excellent moyen de réexécuter et de lancer un nouveau shell pour remplacer le courant. juste pour ajouter à la réponse, $ SHELL renvoie le shell courant qui est bash. En utilisant ce qui suit, il rechargera le shell actuel, et pas seulement pour bash.

exec $SHELL -l;


3

Pour moi, ce qui fonctionne lorsque je change de CHEMIN, c'est: exec "$BASH" --login


La question concerne le rechargement ~/.bashrc, qui ne--login se rechargera pas (directement); au niveau utilisateur, il se rechargera ~/.bash_profile(ou ~/.bash_loginou ~/.profile) à la place.
mklement0

3

type:

source ~/.bashrc

ou, sous une forme plus courte:

. ~/.bashrc


1
Encore une fois, ne fonctionne que si vous êtes dans le répertoire personnel, ou plus précisément, dans le répertoire où .bashrcse trouve. Une manière plus correcte de le faire, comme indiqué dans la réponse acceptée, est source ~/.bashrc.
John Red

2

j'utilise la commande suivante sur msysgit

. ~/.bashrc

version plus courte de

source ~/.bashrc

@jwg la réponse acceptée est. .bashrc. ne fonctionnera que si vous êtes dans le répertoire personnel de msysgit.
Sojan V Jose

@jwg ok i thin je mentionnais que vous n'avez pas besoin de taper 'source ~ / .bashrc' à la place, utilisez la version plus courte.
Sojan V Jose

@jwg ok je l'ai ajouté en tant que modification à la réponse originale :)
Sojan V Jose

Pourquoi la réponse redondante @Sojan?
nitinr708

@ nitinr708 2014. je me souviens à peine: P. la réponse originale a été modifiée plus tard, je suppose.
Sojan V Jose

2

En supposant un shell interactif, et vous souhaitez conserver votre historique de commandes actuel et également charger / etc / profile (qui charge les données d'environnement, y compris / etc / bashrc et sur Mac OS X, charge les chemins définis dans /etc/paths.d/ via path_helper), ajoutez votre historique de commandes et faites un exec de bash avec l'option login ('-l'):

history -a && exec bash -l

1

Cela fonctionnera également ..

cd ~
source .bashrc

7
Il le fait, mais il change également le répertoire de travail en ~, ce qui n'est pas souhaité.
Albin

1
Merci de garder le contexte vivant @Krinkle
nitinr708

Est-il nécessaire de spécifier ~de changer le répertoire de travail en répertoire de base de l'utilisateur?
Kenly

1

J'ai remarqué que la exec bashcommande pure préservera les variables d'environnement, vous devez donc utiliserexec -c bash pour exécuter bash dans un environnement vide.

Par exemple, vous vous connectez à un bash et export A=1, si vous exec bash,A == 1 .

Si vous exec -cl bash,A c'est vide.

Je pense que c'est la meilleure façon de faire votre travail.


-2

j'ai personnellement

alias ..='source ~/.bashrc'

dans mon bashrc, afin que je puisse simplement utiliser ".." pour le recharger.


4
Beaucoup de gens l'utilisent ..comme alias cd .., donc ce sera très déroutant.
The Godfather

sauf pour le nom de l'alias une bonne idée. alias rehash='source ~/.bashrc'est mon choix.
Frank Nocke

utiliser quelque chose comme "_rs" que j'utilise comme shell de rechargement. j'utilise à peu près _ pour un début de mes alias; qui est similaire à js libs underscorejs ou lodash.
Jimmy MG Lim
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.