Impossible de générer avec succès .bashrc à partir d'un script shell

35

Normalement, nous pouvons générer le fichier ~/.bashrc en utilisant cette commande

source ~/.bashrc

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

mon code shell:

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

Nous avons également essayé .[dot] au lieu de source . Même résultat

    
posée shantanu 05.10.2011 - 13:50
la source

5 réponses

22

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

En revanche, la commande source ne démarre pas une nouvelle instance de shell mais utilise le shell en cours pour que les modifications restent.

Si vous voulez un raccourci pour lire votre fichier .bashrc, utilisez une fonction shell ou un alias au lieu d’un script shell, comme

alias brc='source ~/.bashrc'
    
réponse donnée Florian Diesch 05.10.2011 - 14:16
la source
13

Essayez:

exec bash

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

    
réponse donnée Alin Andrei 05.10.2011 - 14:37
la source
8

Votre .bashrc démarre généralement:

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

É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 s’arrête tôt. Pour démontrer, modifiez votre script:

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

cela permettra désormais à vos scripts de fonctionner avec le nouveau .bashrc . Remarque: une fois que votre script est terminé, env sera défini sur ce qu'il était avant de lancer le script. Les modifications seront reflétées lors du prochain démarrage du terminal.

    
réponse donnée ravi nankani 08.11.2011 - 12:11
la source
2

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 du plus simple #!/usr/bin/env one laisse passer les arguments à l'interpréteur, ce qui est selon moi la clé - voir ce document pour plus d'informations.

Dans tous les cas, si les commandes source sous quelque forme que ce soit ne fonctionnent pas, essayez de vérifier votre shebang, cela pourrait être le problème:)

    
réponse donnée Nikksno 21.08.2016 - 03:40
la source
2

Je souhaite compléter la réponse de ravi :

Ce comportement est spécifique à Ubuntu (et probablement à la plupart des distributions dérivées), puisque votre fichier ~/.bashrc par défaut 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 est exécuté dans un shell non interactif, ce qui est le cas de votre script depuis tous les scripts sont exécutés dans un shell non interactif , et par la suite chaque fichier source héritera de cette propriété.

eval hack

J'ai découvert un hack moche pour contourner spécifiquement Ubuntu, en utilisant eval au lieu de source :

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

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

Sachez qu’il s’agit d’un numéro magique et qu’il risque de ne pas fonctionner avec les versions d’Ubuntu; mais peut être une bonne solution si vous créez des scripts pour des systèmes plus ou moins connus.

Une solution plus sophistiquée peut impliquer l'utilisation de regex pour cibler les bits spécifiques qui arrêtent l'évaluation.

Alternative au 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 la shebang :

#!/bin/bash -i

Soyez conscient de quelques choses:

réponse donnée stefanmaric 28.05.2018 - 23:08
la source

Lire d'autres questions sur les étiquettes