12
votes

Ne peut pas obtenir expand_aliases à prendre effet

Je ne peux pas obtenir expand_aliases pour prendre effet dans Bash. J'ai essayé beaucoup de choses différentes, et rien ne fonctionne.

Voici le cas de test simple: xxx

et la sortie: xxx

(Oui, j'utilise ShopT au lieu de l'option -o -o pour baster, juste pour le prouver que cela est fait.)

Des idées?


2 commentaires

Avez-vous essayé shopt -p expand_aliases pour voir s'il est réellement activé ou non?


Oui, et il est revenu oui. Dennis l'a eu; Lorsque j'ai sauvegardé ce qui précède dans un script shell et le dirigé, cela fonctionnait correctement.


3 Réponses :


14
votes

Les alias ne sont pas disponibles sur la même ligne ni dans la même fonction où ils sont définis.

à partir de la page Man Bash: P>

       The rules concerning the definition and use  of  aliases  are  somewhat
       confusing.   Bash  always  reads  at  least  one complete line of input
       before executing any  of  the  commands  on  that  line.   Aliases  are
       expanded  when  a command is read, not when it is executed.  Therefore,
       an alias definition appearing on the same line as another command  does
       not  take  effect  until  the next line of input is read.  The commands
       following the alias definition on that line are not affected by the new
       alias.   This  behavior  is  also an issue when functions are executed.
       Aliases are expanded when a function definition is read, not  when  the
       function  is  executed,  because a function definition is itself a com‐
       pound command.  As a consequence, aliases defined in a function are not
       available  until  after  that function is executed.  To be safe, always
       put alias definitions on a separate line, and do not use alias in  com‐
       pound commands.

       For almost every purpose, aliases are superseded by shell functions.


2 commentaires

C'est un grave lmmanpagetfy


Ils devraient ajouter cela aussi à bash info: "Et aussi en conséquence, des alias utilisés dans des fonctions doivent être définis avant les définitions de fonctions à l'alias fonctionnent réellement."



1
votes

Je suis arrivé en retard pendant 10 ans. Vous pouvez utiliser le eval code> pour effectuer l'alias CDTMP code> Développer à nouveau.

alias cdtmp='cd /tmp'
/tmp


1 commentaires

Utilisation de eval afin que vous puissiez utiliser alias dans un script est juste ... horrible. Maintenant, vous avez deux problèmes. La solution appropriée consiste à utiliser des alias dans des scripts.



0
votes

Essayez / bin / bash -o expand_aliases -c 'xx'


0 commentaires