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

1645

Si j'apporte des modifications à .bashrc, comment puis-je le recharger sans me déconnecter et me reconnecter?

Jed Daniels
la source

Réponses:

2638

Il vous suffit de saisir la commande:

source ~/.bashrc

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

. ~/.bashrc
George Hawkins
la source
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).

WhoSayIn
la source
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.

mklement0
la source
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
Randy Proctor
la source
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.

James
la source
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 "

Roy Lin
la source
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
Geoffrey Hale
la source
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.

Karolus
la source
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)

SherylHohman
la source
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;

Jimmy MG Lim
la source
3

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

Cecília Assis
la source
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

jwismar
la source
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
Sojan V Jose
la source
@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
beattidp
la source
1

Cela fonctionnera également ..

cd ~
source .bashrc
kirti
la source
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.

Chat chien
la source
-2

j'ai personnellement

alias ..='source ~/.bashrc'

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

Flo
la source
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