web-dev-qa-db-fra.com

Comment passer des arguments de ligne de commande à un alias de shell?

Comment passer les arguments de ligne de commande à un alias? Voici un échantillon:

 alias mkcd = 'mkdir $ 1; cd $ 1; '

Mais dans ce cas, $ xx est traduit au moment de la création du pseudonyme et non au moment de l'exécution. J'ai cependant créé une solution de contournement utilisant une fonction Shell (après avoir googlé un peu) comme ci-dessous:

 function mkcd () {
 mkdir $ 1 
 cd $ 1 
} 

Je voulais juste savoir s’il existe un moyen de créer des alias acceptant les paramètres CL.
BTW - J'utilise 'bash' comme shell par défaut.

261
Vini

Vous avez trouvé le moyen: créez une fonction au lieu d'un alias. Le shell C dispose d’un mécanisme permettant de traiter les arguments des alias, contrairement à bash et au shell Korn, car le mécanisme de la fonction est plus flexible et offre les mêmes possibilités.

159
Charlie Martin

Juste pour répéter ce qui a été écrit pour d’autres coquilles, dans Bash les oeuvres suivantes:

alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'

En cours d'exécution:

blah one two

Donne la sortie ci-dessous:

First: one
Second: two
254
Thomas Bratt

Vous ne pouvez pas en ksh, mais en csh.

alias mkcd 'mkdir \!^; cd \!^1'

En ksh, la fonction est la voie à suivre. Mais si vous vouliez vraiment utiliser un alias:

alias mkcd='_(){ mkdir $1; cd $1; }; _'
53
Sanjaya R

Pour citer la page de manuel bash:

Il n'y a pas de mécanisme pour utiliser des arguments dans le texte de remplacement. Si des arguments sont nécessaires, une fonction Shell doit être utilisée (voir FONCTIONS ci-dessous).

Il semble donc que vous ayez répondu à votre propre question - utilisez une fonction à la place d'un alias

15
Chris Dodd

Vous pouvez également trouver cette commande utile:

mkdir dirname && cd $_

où dirname est le nom du répertoire que vous voulez créer

11
tdecs

Le moyen le plus simple consiste à utiliser une fonction et non un alias. vous pouvez toujours appeler une fonction à tout moment depuis la cli. Dans bash, vous pouvez simplement ajouter un nom de fonction () {commande}, ce qui le charge comme un alias.

function mkcd() { mkdir $1; cd $1 ;}

Pas sûr des autres coquilles

3
Luke Attard

En réalité, vous ne pouvez pas faire ce que vous voulez avec les alias Bash, car les alias sont statiques. Utilisez plutôt la fonction que vous avez créée.

Regardez ici pour plus d'informations: http://www.mactips.org/archives/2008/01/01/increase-productivity-with-bash-aliases-and-functions/ . (Oui, je sais que c'est mactips.org, mais c'est à propos de Bash, alors ne vous inquiétez pas.)

2
samoz

J'ai trouvé que les fonctions ne peuvent pas être écrites dans le fichier ~/.cshrc .. Ici, dans un alias qui prend des arguments

par exemple, les arguments passés à la commande 'find'

alias fl "find . -name '\!:1'"     
Ex: >fl abc

où abc est l'argument passé en tant que!: 1

2
kumar palaniappan

Cela fonctionne en ksh:

$ alias -x mkcd="mkdir \$dirname; cd \$dirname;"
$ alias mkcd
mkcd='mkdir $dirname; cd $dirname;'
$ dirname=aaa 
$ pwd
/tmp   
$ mkcd
$ pwd
/tmp/aaa

L'option "-x" rend l'alias "exporté" - l'alias est visible dans les sous-shell.

Et soyez conscient du fait que les alias définis dans un script ne sont pas visibles dans ce script (car les alias sont développés lorsqu'un script est chargé, et non lorsqu'une ligne est interprétée). Cela peut être résolu en exécutant un autre fichier de script dans le même shell (à l'aide de point).

1
user142925

Voici un exemple simple de fonction utilisant python. Vous pouvez coller dans ~/.bashrc
Vous devez avoir un espace après la première accolade gauche
La commande python doit être placée entre guillemets pour obtenir la substitution de variable.
N'oubliez pas le point-virgule à la fin

function count () {python _c "pour num dans xrange ($ 1): print num";}

$ count 6
0
1
2
3
4
5
$
0
AAAfarmclub

Je pense que vous pouvez le faire avec les fonctions du shell si vous utilisez bash: http://www.cyberciti.biz/faq/linux-unix-pass-argument-to-alias-command/

0
Kevin Hwang