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

StackOverflow https://stackoverflow.com/questions/941338

  •  06-09-2019
  •  | 
  •  

Question

Comment transmettre les arguments de ligne de commande à un alias ?Voici un exemple :

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

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

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

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

Était-ce utile?

La solution

Vous avez trouvé le chemin: créer une fonction au lieu d'un alias. La coque C a un mécanisme pour faire des arguments aux alias, mais bash et le shell Korn ne le font pas, parce que le mécanisme de fonction est plus souple et offre la même capacité.

Autres conseils

Juste pour répéter ce qui a été écrit pour d'autres coquilles, Bash les travaux suivants:

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

L'exécution de ce qui suit:

blah one two

donne la sortie ci-dessous:

First: one
Second: two

Vous ne pouvez pas ksh, mais vous pouvez csh.

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

En ksh, la fonction est le chemin à parcourir. Mais si vous avez vraiment voulu vraiment utiliser alias:

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

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   arguments sont nécessaires, une fonction shell doit être utilisé (voir FONCTIONS   ci-dessous).

Il semble donc que vous avez répondu à votre propre question - utiliser une fonction au lieu d'un alias

Vous pouvez également trouver cette commande utile:

mkdir dirname && cd $_

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

La meilleure façon est d'utiliser la fonction non alias. vous pouvez toujours appeler une fonction à tout moment de la cli. En bash, vous pouvez simplement ajouter le nom de la fonction () {commande} il charge même comme un alias.

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

Je ne sais pas d'autres coquilles

Vous pouvez pas vraiment faire ce que vous voulez avec des alias Bash, car les alias sont statiques. Au lieu de cela, utilisez la fonction que vous avez créé.

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 il est à peu près Bash, alors ne vous inquiétez pas.)

Je trouve que les fonctions ne peuvent pas être écrites dans ~ / .cshrc .. Ici alias qui prend des arguments

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

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

où abc est l'argument passé comme: 1

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 sachez 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é, pas 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 (en utilisant dot).

Je pense que vous êtes en mesure de le faire avec des fonctions shell si vous utilisez bash: http://www.cyberciti.biz/faq/ Linux passer à argument-unix-alias-commande /

  

Voici une fonction simple exemple en utilisant python. Vous pouvez coller dans ~ / .bashrc
   Tu dois avoir un espace après la première accolade gauche
   La commande python doit être entre guillemets pour obtenir la substitution de variable
   Ne pas oublier que virgule à la fin

Nombre de function () {python -c "pour num en xrange (1 $): print num";}

$ count 6
0
1
2
3
4
5
$

Un alias vide exécutera ses args:

alias DEBUG=
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top