web-dev-qa-db-fra.com

Comment passer des paramètres à un alias?

Pour le script bash, je peux utiliser "$@" pour accéder aux arguments. Quel est l'équivalent lorsque j'utilise un alias?

77
prosseek

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 "$@"
}
54
amphetamachine

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.

34
Tom Hale

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.

19
rozcietrzewiacz

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.

15
Warren Young

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

1
stevica