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 .