Comment passer des paramètres à un alias?


64

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

Réponses:


50

Les alias sont comme des commandes en ce sens que tous leurs arguments sont passés en argument au programme qu'ils alias. Par exemple, si vous deviez alias lsà ls -la, puis en tapant ls foo barserait vraiment exécuter ls -la foo barsur 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 "$@"
}

3
opengroup.org/onlinepubs/009695399/utilities/… Les fonctions en shsont définies my_program_wrapper() { ...; }. Bash gère le mot clé, functionmais pourquoi ne pas utiliser ce qui est plus portable?
éphémence

2
@ephemient Très vrai. Je veux dire en plus du fait que tout le monde utilise GNU Bash et non pas le shell barebones POSIX.
Amphetamachine

21

Alias ​​solution

Si vous êtes vraiment contre l'utilisation d'une fonction en tant que telle, 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 $@par $1si 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 passés qu'à la fin. Notez que fs'appelle tout à la fin de l'alias.

Le unset -fsupprime la définition de la fonction car l'alias est exécuté afin qu'il ne reste pas après.


Humm? wrap_args x y zme donne: bash: erreur de syntaxe près du jeton inattendu `('
Vue elliptique

@Elipticalview Hmm, problème de copier / coller? Confirmé de travailler sur bash 4.4.12.
Tom Hale

1
J'avais faliasé. Une fois que je suis imparti, fcela fonctionne bien. L'ancien problème de collision de noms.
Vue elliptique

command type f:)
Tom Hale

1
génial! c'est la variante la plus paresseuse!
Sergius

19

Pour ajouter aux réponses actuelles, il est important de comprendre le fonctionnement des alias: tous les paramètres que vous tapez après une commande avec alias seront utilisés à la fin. Il n'y a donc aucun moyen d'utiliser alias pour deux commandes (connectées ou non), à partir desquelles la première doit 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é de cette question ), il utilisera toujours la sortie de ls -lperformé dans le répertoire courant et fera un grep sur celui-ci - donc, utiliser

lsswp / tmp /

serait équivalent à ls -l | grep swp /tmp/ et non ls -l /tmp/ | grep swp .

Dans tous les cas où les arguments doivent être utilisés quelque part au milieu, il faut utiliser un à la functionplace de alias.


15

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 quitterez lessà EOF (-e), les recherches seront insensibles à la casse (-i), etc.


Pouvez-vous s'il vous plaît regarder ma question - aucune des solutions ne fonctionne pour moi et je ne suis pas autorisé à commencer une prime.
JJD

1
@JJD Celui qui a répondu à votre question est correct: vous voulez une fonction dans ce cas, pas un alias. Puisque la réponse acceptée à cette question est essentiellement la même, votre question a été fermée à juste titre.
Warren Young

1

Je réponds pour csh:

Oui, vous pouvez utiliser les paramètres dans les alias et, à la différence de ce qui a été dit ci-dessus, vous pouvez vous y référer n'importe où dans la définition d'alias, pas seulement à la fin.

Exemple pour tar-gz -ing quelque chose:

$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"

, où !:1et !:2sont les paramètres que vous allez fournir 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 en réalité que vous avez utilisé deux paramètres que vous avez insérés à des emplacements arbitraires de la commande tar, faisant de tout cela un alias. tgz

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.