69 votes

Impossible de réussir à sourcer .bashrc à partir d'un Shell Shell.

Normalement, nous pouvons nous procurer ~/.bashrc en utilisant cette commande

source ~/.bashrc

mais si j'écris ceci dans un Shell Shell et que je l'exécute, rien ne se passe. Pourquoi ?
Y a-t-il un moyen de le faire ?

Mon script :

#!/bin/bash
chmod a+x ~/.bashrc
source ~/.bashrc

A également essayé . (point) au lieu de source . Même résultat.

30voto

Fabiano Soriani Points 543

Un Shell Shell est exécuté dans sa propre instance Shell. Tous les paramètres de variables, les définitions de fonctions et autres n'affectent que cette instance (et peut-être ses enfants) mais pas le Shell appelant, donc ils disparaissent après la fin du Shell.

En revanche, le source ne démarre pas une nouvelle instance de Shell mais utilise la Shell actuelle afin que les changements restent.

Si vous voulez un raccourci pour lire votre .bashrc utilisez une fonction Shell ou un alias au lieu d'un Shell Shell, comme

alias brc='source ~/.bashrc'

28voto

stefanmaric Points 391

Je veux compléter réponse de ravi :

Ce comportement est spécifique à Ubuntu (et probablement à la plupart des distros dérivées), puisque votre système par défaut ~/.bashrc commence par un court-circuit, Ubuntu 18.04, par exemple :

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Cela arrêtera l'évaluation du fichier s'il s'exécute dans un Shell non interactif, ce qui est le cas de votre Shell puisque tous les scripts sont exécutés dans un scriptsnon interactif et par la suite chaque fichier que vous source héritera de cette propriété.

eval pirater

J'ai trouvé une astuce pour contourner Ubuntu en utilisant spécifiquement eval au lieu de source :

eval "$(cat ~/.bashrc | tail -n +10)"

Il saute simplement les quelques premières lignes et évalue le reste de l'article. ~/.bashrc donc le reste est évalué et modifie l'exécution en cours.

Soyez conscient qu'il s'agit d'un nombre magique et qu'il pourrait ne pas fonctionner sur toutes les versions d'Ubuntu ; mais cela peut être une bonne solution si vous fabriquez des scripts pour des systèmes plus ou moins connus.

Une solution plus sophistiquée pourrait consister à utiliser une expression rationnelle pour cibler les bits spécifiques qui arrêtent l'évaluation.

Alternative Shebang

Une autre alternative qui pourrait fonctionner mieux dans certains scénarios est de forcer le script à s'exécuter dans un script interactif en ajoutant un drapeau dans la balise shebang :

#!/bin/bash -i

Faites attention à certaines choses :

  • Il est une meilleure pratique pour utiliser le #!/usr/bin/env bash mais de cette façon, vous ne peut pas démarrer le Shell avec des arguments .
  • Utilisation de la -i a ses propres conséquences, parmi lesquelles, les programmes demanderont une interaction de l'utilisateur et ceci n'est généralement pas prévu pour les scripts, par exemple, l'installation de deb les paquets peuvent arrêter le script à dpkg configure invite .
  • J'ai d'abord essayé d'utiliser set -i y set +i pour activer et désactiver la fonction là où j'en avais besoin, mais cela ne fonctionne pas .

17voto

ravi nankani Points 171

Votre .bashrc commence généralement :

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Puisque votre script n'a pas PS1 set (parce qu'il n'est pas interactif), il ne remet pas le chemin à zéro parce qu'il sort prématurément . Pour démontrer, modifiez votre script :

    #!/bin/bash
    chmod a+x ~/.bashrc
    PS1='$ '
    source ~/.bashrc

cela permettra maintenant à vos scripts de fonctionner avec le nouveau .bashrc . Note : une fois que votre script sort, l'env sera remis à ce qu'il était avant de lancer le script . Les changements seront reflétés la prochaine fois qu'un terminal sera lancé.

11voto

Alin Andrei Points 7268

Essayez :

exec bash

Cela devrait recharger ~/.bashrc , ~/.bash_aliases etc.

3voto

Nikksno Points 31

Aucune des autres méthodes n'a fonctionné pour moi [ source /path/to/file vs . ./path/to/file , alias, etc...], jusqu'à ce que, grâce à ce tutoriel J'ai trouvé qu'en utilisant le :

#!/usr/bin/env bash shebang

au lieu de la plus simple #!/usr/bin/env on laisse les arguments passer à l'interpréteur, ce qui, je pense, est la clé ici - voir ce document pour plus d'informations.

En tout cas, si les commandes sources, sous quelque forme que ce soit, ne fonctionnent pas pour vous, essayez de vérifier votre shebang, c'est peut-être le problème :)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X