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?

Prosseek
la source

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 "$@"
}
amphétamachine
la source
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.

Tom Hale
la source
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.

rozcietrzewiacz
la source
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.

Warren Young
la source
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

stevica
la source