Les fonctions et les alias peuvent tous deux utiliser des paramètres, comme d'autres l'ont montré ici. En outre, je voudrais souligner quelques autres aspects :
1. La fonction s'exécute dans sa propre portée, l'alias partage la portée.
Il peut être utile de connaître cette différence dans les cas où vous devez cacher ou exposer quelque chose. Cela suggère également qu'une fonction est le meilleur choix pour l'encapsulation.
function tfunc(){
GlobalFromFunc="Global From Func" # Function set global variable by default
local FromFunc="onetwothree from func" # Set a local variable
}
alias talias='local LocalFromAlias="Local from Alias"; GlobalFromAlias="Global From Alias" # Cant hide a variable with local here '
# Test variables set by tfunc
tfunc # call tfunc
echo $GlobalFromFunc # This is visible
echo $LocalFromFunc # This is not visible
# Test variables set by talias
# call talias
talias
echo $GlobalFromAlias # This is invisible
echo $LocalFromAlias # This variable is unset and unusable
Sortie :
bash-3.2$ # Test variables set by tfunc
bash-3.2$ tfunc # call tfunc
bash-3.2$ echo $GlobalFromFunc # This is visible
Global From Func
bash-3.2$ echo $LocalFromFunc # This is not visible
bash-3.2$ # Test variables set by talias
bash-3.2$ # call talias
bash-3.2$ talias
bash: local: can only be used in a function
bash-3.2$ echo $GlobalFromAlias # This is invisible
Global From Alias
bash-3.2$ echo $LocalFromAlias # This variable is unset and unusable
2. le wrapper script est un meilleur choix
Il m'est arrivé à plusieurs reprises qu'un alias ou une fonction ne soit pas trouvée lorsque se connecter via ssh
ou impliquant un changement de nom d'utilisateur ou un environnement multi-utilisateurs. Il y a des trucs et astuces avec les fichiers point de source, ou cet intéressant avec les alias : alias sd='sudo '
laisse cet alias ultérieur alias install='sd apt-get install'
fonctionnent comme prévu (remarquez l'espace supplémentaire dans sd='sudo '
). Cependant, un wrapper script fonctionne mieux qu'une fonction ou un alias dans des cas comme celui-ci. Le principal avantage avec un wrapper script est qu'il est visible/exécutable pour sous le chemin prévu (i.e. /usr/loca/bin/) alors qu'une fonction/alias doit être sourcée avant d'être utilisable. Par exemple, vous mettez une fonction dans un ~/.bash_profile ou ~/.bashrc pour bash
mais passer ensuite à un autre interpréteur de commandes (c'est-à-dire zsh
) alors la fonction n'est plus visible. Ainsi, lorsque vous avez un doute, un wrapper script est toujours la solution la plus fiable et la plus portable.
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.