61 votes

Comment définir un alias à l'intérieur d'un shell bash script

OSX : Cela fonctionne à partir de la ligne de commande : alias ruby="/opt/local/bin/ruby1.9".

mais dans le côté d'un shell script, cela n'a aucun effet. Je veux écrire un script qui basculera entre ruby 1.8 et ruby 1.9, donc cela doit être un script - pas dans mon profil.

Il semble que "source script.sh" fonctionne, mais "./script.sh". Comment cela se fait-il ? Comment puis-je reproduire cela dans mon script ?

Merci !

103voto

SiteMonger Points 616

La réponse simple pour vous est que les scripts créent des shells non interactifs et que, par défaut, l'option expand_aliases est souvent désactivée.

Vous pouvez corriger cela très simplement en ajoutant la ligne suivante au début de votre script pour activer l'expansion des alias :

shopt -s expand_aliases

Ce problème m'a tracassé, j'ai donc fait des recherches et j'ai écrit un article de blog une fois que j'ai trouvé comment le résoudre moi-même : Article sur l'utilisation des alias dans les scripts shell Linux.

Bien sûr, juste après avoir trouvé cette partie, j'ai découvert que, bien que cela fonctionne pour ce dont vous avez besoin, cela ne fonctionnera pas si vous avez un sous-shell dans un sous-shell. Je suis toujours à la recherche d'une solution à ce problème, c'est pourquoi je viens de tomber sur votre question. Sur le billet de blog, je mentionne un hack bon marché que j'utilise pour récupérer l'alias dans un shell script. Ce n'est pas élégant, mais cela fonctionne même dans ce problème de sous-shells multiples que j'ai.

74voto

codaddict Points 154968

./script.sh sera exécuté dans un sous-shell et les modifications apportées ne s'appliqueront qu'au sous-shell. Une fois la commande terminée, le sous-shell disparaît, de même que les modifications.

le sourcing du fichier en utilisant . ./script.sh ou source ./script.sh lira et exécutera des commandes à partir de l'argument nom-fichier dans le contexte actuel de l'interpréteur de commandes, c'est-à-dire lorsqu'un script est exécuté en utilisant source il s'exécute dans le shell existant, toutes les variables créées ou modifiées par le script resteront disponibles après la fin du script.

7voto

Dave Bacher Points 7237

Vous pouvez écrire une fonction dans votre .profile pour changer les alias.

function toggle-ruby() {
  if [ "$1" == "1.9" ]; then
    alias ruby=/opt/local/bin/ruby1.9
  else
    alias ruby=/opt/local/bin/ruby1.8
  fi
}

alors tu peux courir :

toggle-ruby 1.9

ou

toggle-ruby 1.8

pour passer de l'un à l'autre.

7voto

zwal se konia Points 31

Si vous devez changer de version de Ruby, essayez rvm .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X