web-dev-qa-db-fra.com

Alias ​​et fonctions

Du manuel bash

Les règles concernant la définition et l'utilisation des alias sont quelque peu confuses. Bash lit toujours au moins une ligne d'entrée complète avant d'exécuter l'une des commandes de cette ligne. Les alias sont développés lors de la lecture d'une commande et non lors de son exécution. Par conséquent, une définition d'alias apparaissant sur la même ligne qu'une autre commande ne prend effet que lorsque la ligne d'entrée suivante est lue. Les commandes suivant la définition d'alias sur cette ligne ne sont pas affectées par le nouvel alias. Ce comportement est également un problème lorsque des fonctions sont exécutées. Les alias sont développés lorsqu'une définition de fonction est lue, pas lorsque la fonction est exécutée, car une définition de fonction est elle-même une commande composée. En conséquence, les alias définis dans une fonction ne sont disponibles qu'après l'exécution de cette fonction. Pour être sûr, placez toujours les définitions d'alias sur une ligne distincte et n'utilisez pas d'alias dans les commandes composées.

Les deux phrases "Les alias sont développés lors de la lecture d'une définition de fonction, pas lorsque la fonction est exécutée" et "les alias définis dans une fonction ne sont disponibles qu'après l'exécution de cette fonction" semblent être opposées.

Pouvez-vous expliquer ce qu'ils signifient respectivement?

17
Tim
  1. Les alias sont développés lors de la lecture d'une définition de fonction, pas lors de l'exécution de la fonction…

    $ echo "Le renard brun rapide saute par-dessus le chien paresseux." > monfichier 
     
     $ alias myalias = chat 
     
     $ myfunc () {
    > myalias monfichier 
    >} 
     
     $ myfunc 
     Le renard brun rapide saute par-dessus le chien paresseux. 
     
     $ alias myalias = "ls -l" 
     
     $ myalias myfile 
     - rw-r - r-- 1 myusername mygroup 45 déc 13 07:07 myfile 
     
     $ myfunc 
     Le brun rapide le renard saute par-dessus le chien paresseux.

    Même si myfunc a été défini pour appeler myalias et que j'ai redéfini myalias, myfunc exécute toujours la définition d'origine de myalias. Parce que l'alias était développé lorsque la fonction a été définie. En fait, le Shell ne se souvient plus que myfunc appelle myalias; il sait seulement que myfunc appelle cat:

    $ type myfunc 
     myfunc est une fonction 
     myfunc () 
     {
     cat myfile 
    }
  2. … Les alias définis dans une fonction ne sont disponibles qu'après l'exécution de cette fonction.

    $ echo "Le renard brun rapide saute par-dessus le chien paresseux." > monfichier 
     
     $ myfunc () {
    > alias myalias = chat 
    >} 
     
     $ myalias myfile 
     - bash: myalias: commande introuvable 
     
     $ myfunc 
     
     $ myalias myfile 
     Le renard brun rapide saute par-dessus le chien paresseux.

    L'alias myalias n'est pas disponible tant que la fonction myfunc n'a pas été exécutée. (Je pense que ce serait plutôt étrange si la définition de la fonction qui définit l'alias était suffisante pour que l'alias soit défini.)

J'ai besoin de la réponse indiquée par la première phrase lorsque j'essaye l'extrait ci-dessous dans mon .bashrc.

alias ls='\ls -F --color=auto --show-control-chars'
alias ll='ls -ahl'
function lf_macro() {
    local CMD=${1:-ls} DIR=${2:-.};
    $CMD $(find $DIR -maxdepth 1 -type f);
}
function lf() { lf_macro ll "$1"; }
function lsf() { lf_macro ls "$1"; }     # list all file, no directories

après unalias -a; source ~/.bashrc, J'essaie d'exécuter lf et lsf,

$ lf
-bash: ll: command not found

$ lsf
./file1 ./file2 ./script.sh ...     # no color, no control-chars

$ ls $(find -maxdepth 1 -type f)
./file1 ./file2 ./script.sh* ...

il semble clairement que les alias sont développés lors de la définition de la fonction, pas de l'exécution de la fonction, car:

  • lorsque j'exécute lf, l'erreur -bash: ll: command not found, et
  • quand j'exécute lsf, /usr/bin/ls est utilisé, pas la forme d'alias, pas de surbrillance de couleur et pas de caractères de contrôle après le fichier exécutable.
1
qeatzy