306 votes

Comment passer les arguments de la ligne de commande à un alias du shell ?

Comment passer les arguments de la 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 un peu cherché 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.

2 votes

O/T mais à propos d'une alternative à faire une fonction mkcd, vous pouvez écrire mkdir mydirectoryname && cd $_

309voto

Thomas Bratt Points 10738

Juste pour répéter ce qui a été affiché pour d'autres coquilles, en Bash les œuvres suivantes :

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

Exécuter ce qui suit :

blah one two

Donne le résultat ci-dessous :

First: one
Second: two

5 votes

Excellente solution. Quelques questions de la part d'un novice en bash : La fonction doit-elle être nommée avec un trait de soulignement (ou différemment) ou est-ce juste pour la lisibilité ? A quoi sert le ";_blah" qui suit dans la définition de la fonction ? Pourquoi la fonction ne fonctionne-t-elle pas si l'on utilise des guillemets doubles à la place des guillemets simples (le $1 n'est pas interprété correctement), même si l'on fait quelque chose qui ne nécessite pas de guillemets autour du $1 ? Merci d'avance pour vos conseils. J'ai une solution qui fonctionne mais j'aimerais toujours mieux comprendre pourquoi elle fonctionne.

4 votes

@mynameispaulie La fonction peut être nommée n'importe comment. J'ai utilisé un préfixe souligné car c'est une astuce courante pour éviter les collisions de noms (c'est-à-dire une autre fonction avec le même nom).

2 votes

@mynameispaulie En ce qui concerne la trailing ;_blah : Le point-virgule sert à terminer l'instruction qui définit la fonction. Le site _blah qui suit le point-virgule est la fonction réelle appelée lorsque l'alias est exécuté. Il peut être utile de comprendre que lorsque l'alias est exécuté, une fonction est définie (ou redéfinie si elle a été exécutée précédemment), puis elle est réellement appelée.

182voto

Charlie Martin Points 62306

Vous avez trouvé la solution : créez une fonction au lieu d'un alias. L'interpréteur de commandes C a un mécanisme pour faire des arguments aux alias, mais bash et l'interpréteur de commandes Korn n'en ont pas, parce que le mécanisme de fonction est plus flexible et offre les mêmes possibilités.

1 votes

Cependant, vous n'avez pas besoin de fonctions lorsque vous créez des alias dans l'application .bashrc fichier. Par exemple # créer un alias qui prend le numéro de port par l'utilisateur alias serve="python -m SimpleHTTPServer $1" Après avoir effectué la modification dans le fichier .bashrc, assurez-vous d'entrer la commande suivante. ~$ source .bashrc Vous devriez être en mesure de l'utiliser comme suit ~$ serve 8998

8 votes

@kaizer1v, Mon observation sur CentOS7.3 bash version 4.2.46 est que votre suggestion ne fonctionne pas comme vous le pensez. Parce que vous utilisez des guillemets doubles, le $1 est en fait évalué à une chaîne vide et l'alias est en fait le même que l'alias serve="python -m SimpleHTTPServer" et donc tout ce que vous passez après cet alias est AUSSI passé sur la ligne de commande. Si vous essayez ceci set -x ; alias serve="python -m SimpleHTTPServer $1 &" vous verrez l'erreur/problème. Votre argument et la commande alias sont exécutés comme des commandes séparées.

59voto

Sanjaya R Points 2280

Vous ne pouvez pas le faire en ksh, mais vous pouvez le faire en csh.

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

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

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

0 votes

À titre d'information, je pense que la vulnérabilité d'exécution de code à distance dont tout le monde a parlé récemment implique de faire presque exactement la même chose, mais dans une variable d'environnement définie par une entrée utilisateur brute. openwall.com/lists/oss-security/2014/09/24/11

1 votes

@Floegipoky - Parce que c'est dans un alias et non dans une var env, c'est substantiellement différent. Le problème de ShellShock est qu'il s'exécute lorsque la variable env est définie. La définition d'une var env est censée être une opération sûre. Aucun script ne s'exécute lorsque l'alias ci-dessus est défini, seulement lorsque l'alias est exécuté.

0 votes

Il convient peut-être de souligner que csh n'est généralement pas ce qu'une personne moderne devrait vouloir utiliser. L'indirection alias-qui-crée-une-fonction-qui-exécute-cette-fonction est relativement populaire, mais n'offre aucun avantage par rapport à une fonction correcte pour autant que je puisse dire. (La fonction doit citer correctement son argument, de toute façon.) Downvoting.

17voto

Chris Dodd Points 1990

Pour citer la page de manuel de bash :

Il n'existe pas de mécanisme permettant d'utiliser des arguments dans le texte de remplacement. Si arguments sont nécessaires, une fonction shell doit être utilisée (voir FUNCTIONS ci-dessous).

Il semble donc que vous ayez répondu à votre propre question : utilisez une fonction au lieu d'un alias.

13voto

tdecs Points 85

Vous pouvez également trouver cette commande utile :

mkdir dirname && cd $_

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

1 votes

@StarDust $_ est la sortie de la dernière commande unix.stackexchange.com/a/271693/169772

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