NB : Au cas où l'idée ne serait pas évidente, c'est une mauvaise idée d'utiliser des alias pour autre chose que des alias, le premier étant la "fonction dans un alias" et le second étant la "redirection/source difficile à lire". En outre, il existe des défauts (que je pensée serait évident, mais juste au cas où vous seriez confus : je ne veux pas qu'ils soient utilisés... nulle part !)
................................................................................................................................................
J'ai déjà répondu à cette question, et c'était toujours comme ça dans le passé :
alias foo='__foo() { unset -f $0; echo "arg1 for foo=$1"; }; __foo()'
ce qui est très bien, à moins que vous n'évitiez complètement l'utilisation de fonctions. Dans ce cas, vous pouvez profiter de la grande capacité de bash à rediriger le texte :
alias bar='cat <<< '\''echo arg1 for bar=$1'\'' | source /dev/stdin'
Ils sont tous deux de la même longueur, à quelques caractères près.
El réel L'élément déterminant est la différence de temps, le haut étant la "méthode de la fonction" et le bas la "méthode de la source redirigée". Pour prouver cette théorie, le timing parle de lui-même :
arg1 for foo=FOOVALUE
real 0m0.011s user 0m0.004s sys 0m0.008s # <--time spent in foo
real 0m0.000s user 0m0.000s sys 0m0.000s # <--time spent in bar
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
real 0m0.010s user 0m0.004s sys 0m0.004s
real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
real 0m0.011s user 0m0.000s sys 0m0.012s
real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
real 0m0.012s user 0m0.004s sys 0m0.004s
real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
real 0m0.010s user 0m0.008s sys 0m0.004s
real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
Il s'agit de la partie inférieure d'environ 200 résultats, obtenus à des intervalles aléatoires. Il semble que la création/destruction de fonctions prenne plus de temps que la redirection. J'espère que cela aidera les futurs visiteurs à répondre à cette question (je ne voulais pas la garder pour moi).
3 votes
Duplicata possible de Shell script : Comment passer des arguments de ligne de commande à un alias UNIX ?
3 votes
Assurez-vous que vous utilisez des guillemets autour des args
"$1"
1 votes
Cette question est hors sujet pour l'OS. Elle a été répondu sur UNIX.SE et la réponse est que vous n'avez même pas besoin de vous en soucier : "Par exemple, si vous deviez aliaser
ls
als -la
puis en tapantls foo bar
serait vraiment exécuterls -la foo bar
sur la ligne de commande".11 votes
Cela n'aiderait pas à interpoler une variable au milieu d'une chaîne de caractères
4 votes
Voici le petit alias de test que j'ai utilisé pour découvrir cette erreur...
alias test_args="echo PREFIX --$1-- SUFFIX"
qui, lorsqu'il est appelé avectest_args ABCD
donne la sortie de console suivantePREFIX ---- SUFFIX ABCD
5 votes
Notez que depuis au moins 1996, la documentation de bash contient la ligne : " Pour presque tous les usages, les alias sont remplacés par les fonctions du shell ", et je pense que c'est un euphémisme. Il n'y a absolument aucune raison d'utiliser un alias au lieu d'une fonction.
2 votes
@WilliamPursell : "Absolument aucune raison" ? Tout d'abord, il y a certains cas où une fonction ne peut pas remplir le rôle d'un alias, par exemple un alias se terminant par une citation ouverte ne pourrait pas être fait comme une fonction (bien que vous ne voudriez probablement pas le faire de toute façon). De manière plus réaliste, un alias se terminant par
do
serait impossible ou peu pratique à écrire comme une fonction. Deuxièmement, pour tous vous pouvez facilement développer l'alias à l'aide de la commandeA-a
dans ZSH ouC-A-e
dans Bash (ou ce que vous configurez), alors que cette fonctionnalité n'est pas disponible pour les fonctions.0 votes
@pyrocrasty En bash, vous pouvez utiliser l'expansion de tabulation pour développer les noms de fonctions. (Je ne suis pas sûr pour zsh).
0 votes
@WilliamPursell : Je ne parle pas de la complétion de nom, je veux dire que vous pouvez développer le nom de l'alias dans sa définition en ligne. (Essayez de taper un alias et ensuite
C-A-e
avec le curseur juste après) C'est particulièrement pratique lorsque vous ne vous souvenez pas des options d'une commande mais que vous avez un alias proche de ce dont vous avez besoin.0 votes
@pyrocrasty C'est une fonctionnalité très pratique (si j'utilisais des alias !). Pour les futurs lecteurs, C-A-e est la liaison de lecture par défaut pour la fonction alias-expand-line, qui n'est pas liée par défaut en mode vi.