123 votes

Passer un argument à un alias dans bash

Est-il possible de faire ce qui suit ?

Je veux exécuter ce qui suit :

mongodb bin/mongod

Dans mon bash_profile j'ai

alias = "./path/to/mongodb/$1"

224voto

Dennis Williamson Points 105818

Un alias se développera jusqu'à la chaîne qu'il représente. Tout ce qui suit l'alias apparaîtra après son expansion sans avoir besoin d'être ou pouvoir être passé comme argument explicite (ex. $1 ).

$ alias foo='/path/to/bar'
$ foo some args

sera étendu à

$ /path/to/bar some args

Si vous voulez utiliser des arguments explicites, vous devrez utiliser une fonction

$ foo () { /path/to/bar "$@" fixed args; }
$ foo abc 123

sera exécuté comme si vous aviez fait

$ /path/to/bar abc 123 fixed args

Pour annuler la définition d'un alias :

unalias foo

Pour annuler la définition d'une fonction :

unset -f foo

Pour voir le type et la définition (pour chaque alias, mot-clé, fonction, buildin ou fichier exécutable défini) :

type -a foo

Ou type seulement (pour l'occurrence de la plus haute priorité) :

type -t foo

22voto

leed25d Points 367

Habituellement, lorsque je veux passer des arguments à un alias dans Bash, j'utilise une combinaison d'un alias et d'une fonction, comme ceci, par exemple :

function __t2d {                                                                
         if [ "$1x" != 'x' ]; then                                              
            date -d "@$1"                                                       
         fi                                                                     
} 

alias t2d='__t2d'

19voto

osirisgothra Points 368

Pour utiliser les paramètres dans les alias, j'utilise cette méthode :

alias myalias='function __myalias() { echo "Hello $*"; unset -f __myalias; }; __myalias'

c'est une fonction auto-destructrice enveloppée dans un alias, donc c'est à peu près le meilleur des deux mondes, et ne prend pas une ou plusieurs lignes supplémentaires dans vos définitions... ce que je déteste, oh oui et si vous avez besoin de cette valeur de retour, vous devrez la stocker avant d'appeler unset, et ensuite retourner la valeur en utilisant le mot clé "return" dans cette fonction auto-destructrice là :

alias myalias='function __myalias() { echo "Hello $*"; myresult=$?; unset -f __myalias; return $myresult; }; __myalias'

donc..

vous pourriez, si vous avez besoin d'avoir cette variable là-dedans

alias mongodb='function __mongodb() { ./path/to/mongodb/$1; unset -f __mongodb; }; __mongodb'

bien sûr...

alias mongodb='./path/to/mongodb/'

ferait en fait la même chose sans avoir besoin de paramètres, mais comme je l'ai dit, si vous les vouliez ou en aviez besoin pour une raison quelconque (par exemple, vous aviez besoin de $2 au lieu de $1), vous auriez besoin d'utiliser un wrapper comme celui-ci. S'il y a plus d'une ligne, vous pourriez envisager d'écrire simplement une fonction, car cela deviendrait de plus en plus gênant au fur et à mesure que la ligne s'agrandit. Les fonctions sont géniales car elles permettent de bénéficier de tous les avantages qu'elles offrent (voir completion, traps, bind, etc. pour les avantages que les fonctions peuvent fournir, dans la page de manuel de bash).

J'espère que cela vous aidera :)

3voto

jimgug Points 1

Sur csh (par opposition à bash ) vous pouvez faire exactement ce que vous voulez.

alias print 'lpr \!^ -Pps5'
print memo.txt

La notation \!^ fait en sorte que l'argument soit inséré dans la commande à ce moment-là.

Le site ! est précédé d'un caractère \ pour éviter qu'elle soit interprétée comme une commande d'historique.

Vous pouvez également passer plusieurs arguments :

alias print 'lpr \!* -Pps5'
print part1.ps glossary.ps figure.ps

(Exemples tirés de http://unixhelp.ed.ac.uk/shell/alias_csh2.1.html .)

-3voto

Schroeder Points 94

Pour simplifier la réponse de leed25d, utilisez une combinaison d'un alias et d'une fonction. Par exemple :

function __GetIt {
    cp ./path/to/stuff/$* .
}

alias GetIt='__GetIt'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X