Je veux compléter la réponse de Ravi :
Ce comportement est spécifique à Ubuntu (et probablement à la plupart des distributions dérivées), car votre ~/.bashrc
fichier 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, car tous les scripts sont exécutés dans un shell non interactif , et par la suite tous les fichiers dont vous source
hériterez.
eval
pirater
J'ai découvert un vilain bidouillage pour contourner spécifiquement Ubuntu, en utilisant à la eval
place de source
:
eval "$(cat ~/.bashrc | tail -n +10)"
Il saute simplement les quelques premières lignes et évalue le reste ~/.bashrc
afin que le reste soit évalué et modifie l'exécution en cours.
Sachez qu’il s’agit d’un nombre magique qui pourrait ne pas fonctionner avec toutes les versions d’Ubuntu; mais peut être une bonne solution si vous construisez des scripts pour des systèmes plus ou moins connus.
Une solution plus sophistiquée pourrait impliquer l’utilisation de regex pour cibler les bits spécifiques qui arrêtent l’évaluation.
Alternative 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 le shebang :
#!/bin/bash -i
Soyez conscient de certaines choses:
- Il est préférable d’utiliser le
#!/usr/bin/env bash
formulaire, mais de cette manière, vous ne pouvez pas démarrer le shell avec des arguments .
- L'utilisation de
-i
a ses propres conséquences, parmi lesquelles les programmes inviteront les utilisateurs à interagir, ce qui n'est généralement pas destiné aux scripts. Par exemple, l'installation de deb
packages peut arrêter le script à l' dpkg configure
invite .
- J'ai d'abord essayé d'utiliser
set -i
et set +i
d'activer et de désactiver la fonctionnalité là où j'en avais besoin, mais cela ne fonctionne pas .