J'utilise un script (auquel je n'ai pas accès en écriture) qui crée un tas d'alias pour configurer un environnement. Je voudrais créer une fonction bash pour configurer mon environnement, mais il semble que les alias ne survivent pas au corps de la fonction.
Voici un exemple minimal:
# aliases.sh
alias fooAlias='echo "this will never work!"'
.
# .bashrc
function setupLotsOfThings() {
source aliases.sh
fooAlias
}
.
Maintenant, si je source simplement de manière aliases.sh
interactive, les choses fonctionnent comme prévu:
[mycomputer]~/ $ source aliases.sh
[mycomputer]~/ $ fooAlias
this will never work!
Cependant, si j'appelle à la place la fonction définie dans mon .bashrc, il ne reconnaît pas l'alias après avoir obtenu sa définition:
[mycomputer]~/ $ setupLotsOfThings
-bash: fooAlias: command not found
Qu'est-ce qui se passe ici? Y a-t-il quelque chose qui me manque dans la portée de la alias
commande lorsqu'elle est utilisée dans une fonction?
Edit: je vais ajouter quelques détails au-delà de l'exemple minimal pour mettre en lumière ce que j'essaie d'accomplir.
Pour mon travail, je développe et exécute de nombreux logiciels sur un cluster et / ou une grille. J'ai plusieurs projets qui nécessitent des environnements complètement différents, tels que différentes versions de gcc, des versions de logiciels spécifiques, des chemins de configuration et de données et diverses variables d'environnement. Les administrateurs fournissent les scripts pour configurer diverses choses, généralement en définissant des fonctions shell ou des alias, qui invoquent d'autres fonctions ou alias ou exécutent divers scripts. Pour moi, c'est une boîte noire.
Je voudrais configurer mes propres environnements avec une seule commande. Actuellement, je fais quelque chose comme:
[mycomputer]~/ $ source /some/environment/setup/script.sh
[mycomputer]~/ $ aliasToSetupSomeSoftwareVersion #this was defined in the above
[mycomputer]~/ $ anotherAliasForOtherSoftware
[mycomputer]~/ $ source /maybe/theres/another/script.sh
[mycomputer]~/ $ runSomeOtherSetup # this was defined in the new script
Ces commandes doivent généralement être exécutées dans l'ordre. Mon idée était simplement de copier les lignes ci-dessus dans un bloc fonction, mais comme le montre l'exemple original, cela ne fonctionne tout simplement pas. Des solutions alternatives sont plus que bienvenues!
setupLotsOfThings
, ils ne sont tout simplement pas disponibles pour la fonction elle-même. Ils fonctionnent depuis le shell dont vous avez appelé la fonction. Quoi qu'il en soit, si votre fonction ne source que des alias, pourquoi ne pas simplement utiliser un alias? Par exemple:alias setupstuff="source aliases.sh"
.En fait, vos alias sont disponibles après le chargement de la fonction! Vous pouvez les utiliser dans votre shell interactif, ou dans votre
.bashrc
après avoir exécuté la fonction.La restriction est que les alias dans une définition de fonction sont développés lorsque la définition de fonction est lue, et non lorsque la fonction est évaluée. Il s'agit d'une limitation de bash. Cela fonctionnera donc:
Mais pas ça:
Si vous avez besoin d'alias utilisables à l'intérieur des fonctions et pouvant être définis après l'analyse de la fonction, faites-en plutôt des fonctions. N'oubliez pas que vous pouvez utiliser la fonction
command
intégrée pour appeler une commande externe à partir d'une fonction du même nom.la source