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 ~/.bashrcfichier 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 sourcehériterez.
eval pirater
J'ai découvert un vilain bidouillage pour contourner spécifiquement Ubuntu, en utilisant à la evalplace de source:
eval "$(cat ~/.bashrc | tail -n +10)"
Il saute simplement les quelques premières lignes et évalue le reste ~/.bashrcafin 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 bashformulaire, mais de cette manière, vous ne pouvez pas démarrer le shell avec des arguments .
- L'utilisation de
-ia 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 debpackages peut arrêter le script à l' dpkg configureinvite .
- J'ai d'abord essayé d'utiliser
set -iet set +id'activer et de désactiver la fonctionnalité là où j'en avais besoin, mais cela ne fonctionne pas .