Pour le script bash, je peux utiliser "$@"
pour accéder aux arguments. Quel est l'équivalent lorsque j'utilise un alias?
Les alias sont comme des commandes en ce sens que tous les arguments qui leur sont transmis sont transmis en tant qu'arguments au programme qu'ils alias. Par exemple, si vous deviez alias ls
vers ls -la
, puis en tapant ls foo bar
serait vraiment exécuter ls -la foo bar
sur la ligne de commande.
Si vous voulez avoir un contrôle réel sur la façon dont les arguments sont interprétés, vous pouvez écrire une fonction comme ceci:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "$@"
}
Solution d'alias
Si vous êtes vraiment contre l'utilisation d'une fonction en soi, vous pouvez utiliser:
$ alias wrap_args='f(){ echo before "$@" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
Vous pouvez remplacer $@
avec $1
si vous ne voulez que le premier argument.
Explication
Cela crée une fonction temporaire f
, à laquelle sont passés les arguments.
Les arguments d'alias ne sont transmis qu'à la fin. Notez que f
est appelé à la toute fin de l'alias.
Le unset -f
supprime la définition de la fonction au fur et à mesure que l'alias est exécuté afin qu'il ne reste pas après.
En plus des réponses présentes, une chose importante à comprendre sur le fonctionnement des alias est que tous les paramètres que vous tapez après une commande aliasée seront utilisés littéralement à la fin. Il n'y a donc aucun moyen d'utiliser l'alias pour deux commandes (canalisées ou non), dont la première devrait interpréter les paramètres. Pour être clair, voici un exemple de quelque chose qui ne fonctionnerait pas comme prévu:
alias lsswp="ls -l | grep swp"
(un exemple inspiré par cette question ) cela utilisera toujours la sortie de ls -l
effectué dans le répertoire current et faites un grep à ce sujet - donc en utilisant
lsswp/tmp /
serait équivalent à ls -l | grep swp /tmp/
et pas ls -l /tmp/ | grep swp
.
Dans tous les cas où les arguments doivent être utilisés quelque part au milieu, il faut utiliser un function
au lieu de alias
.
Vous n'avez rien à faire, en fait; les alias le font automatiquement. Par exemple:
$ alias less="less -eirqM"
$ less foo.txt
Vous verrez la première page de foo.txt et less
se fermera à EOF (-e), les recherches seront insensibles à la casse (-i), etc.
Je réponds pour csh:
Oui, vous pouvez utiliser les paramètres dans les alias et - par différence avec ce qui a été dit ci-dessus - vous pouvez vous y référer n'importe où dans la définition de l'alias - pas seulement à la fin.
Exemple pour tar-gz -ing quelque chose:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
, où !:1
et !:2
sont les paramètres que vous fournirez lors de l'appel de votre alias.
Exemple d'utilisation:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
Ce qui signifie effectivement que vous avez utilisé deux paramètres que vous avez insérés à des endroits arbitraires de la commande tar, faisant de tout cela un alias tgz