Alias ​​et fonctions

17

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 lors de la lecture d'une définition de fonction, pas lors de l'exécution de la fonction , 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 étendus lorsqu'une définition de fonction est lue, 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 opposées.

Pouvez-vous expliquer ce qu'ils signifient respectivement?

StackExchange pour tous
la source
Bonne question! J'ai penché quelque chose de nouveau aujourd'hui. En fait, j'ai appris 2 choses: 1) ces informations sur l'expansion des alias au moment où la fonction def est lue, et 2) que je devrais vraiment lire attentivement le manuel de bash (ce que je pensais avoir déjà fait, mais apparemment pas ^^ )
Olivier Dulac
4
La question principale est: quelqu'un devrait-il utiliser des alias en mode non interactif? C'est à cela que servent les fonctions, et les alias rendent les scripts plus sujets aux erreurs. En fait, je n'ai jamais eu besoin des informations ci-dessus, car je n'ai rencontré que des alias dans des .bashrcfichiers tout en haut.
orion

Réponses:

29
  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 monfichier
    -rw-r - r-- 1 myusername mygroup 45 13 déc. 07:07 myfile
     
    $ myfunc
    Le renard brun rapide saute par-dessus le chien paresseux.

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

    $ type myfunc
    myfunc est une fonction
    myfunc ()
    {
    chat 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 monfichier
    -bash: myalias: commande introuvable
     
    $ myfunc
     
    $ myalias monfichier
    Le renard brun rapide saute par-dessus le chien paresseux.

    L' myaliasalias n'est pas disponible tant que la myfuncfonction 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.)

G-Man dit «Réintègre Monica»
la source
4
+1, bonne réponse. Un «corollaire» important à cela est que si l'on a l'intention de définir des fonctions et des alias dans un script, mieux vaut mettre la définition des alias avant les définitions des fonctions! (évident, maintenant, étant donné la réponse, mais je ne le savais pas).
Olivier Dulac
Merci. Je pense qu'un problème sous-jacent est la différence entre l'exécution de la définition d'une fonction et l'appel d'une fonction. Plus précisément, quelles opérations shell sont exécutées lors de l'exécution de la définition d'une fonction et lors de l'appel de la fonction, respectivement? Existe-t-il des opérations shell exécutées lors de l'exécution de la définition d'une fonction et de l'appel de la fonction, ou l'exécution de la définition d'une fonction et l'appel de la fonction effectuent-elles un ensemble d'opérations shell sans chevauchement?
StackExchange for All du
Eh bien, c'est un peu comme la différence entre construire une voiture et conduire une voiture. Ou acheter un sandwich et manger un sandwich. J'ai fourni une réponse plus détaillée à votre autre question .
G-Man dit `` Réintègre Monica ''
Merci. Après avoir relu la citation du manuel bash et votre réponse, je suis confus quant à la signification de l'exécution d'une fonction. Cela signifie-t-il exécuter la définition d'une fonction ou appeler une fonction? Voir unix.stackexchange.com/q/384209/674
StackExchange for All
1

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'essaye d'exécuter lfet 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 clair que les alias sont étendus à la définition de la fonction, pas à l'exécution de la fonction, car :

  • quand j'exécute lf, l'erreur -bash: ll: command not foundet
  • lorsque j'exécute lsf, /usr/bin/lsest 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.
qeatzy
la source