2 votes

Comment fonctionne la commande d'installation de RVM ?

Une question de débutant J'installais RVM (un outil pour gérer Ruby ). La commande est la suivante :

bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )

Je sais un peu que le < est un opérateur de redirection de commande (correct ?).

Alors, pourquoi le second < nécessaire (à quoi sert-il) ?

5voto

andybee Points 497

Il transforme une chaîne en descripteur de fichier pour la sortie du script bash qu'il représente. Cela peut prêter à confusion, voici un exemple

si vous tapez echo <(ls) il ouvrira un nouveau descripteur de fichier, dont le nom est substitué. Ainsi, la commande pourrait se transformer en echo /dev/fd/63 .

Un programme qui attend un fichier peut maintenant lire la sortie de la commande sans avoir à accepter stdin.

$ my_program ls
Error: 'ls': No such file or directory.
$ my_program <(ls)
my_program was called with the argument /dev/fd/63
bin dev etc ...

De nombreux programmes Linux, s'ils ne disposent pas d'une source d'entrée, attendent l'entrée standard. Comme la sortie standard peut être transférée vers l'entrée standard à l'aide de l'opérateur "|", vous pouvez alors utiliser say ls | grep hello . Cela ne fonctionne que parce que grep aurait attendu une entrée de toute façon, s'il avait attendu un nom de fichier à ouvrir et à lire pour obtenir ses données, l'opérateur pipe ne fonctionne pas. C'est pourquoi vous avez besoin de <(...).

J'espère que c'est compréhensible :-)

Avec l'opérateur < pour rediriger la sortie d'un fichier vers un programme lisant stdin, cela donne ce qui suit signification :

Bash : lire la sortie de ce fichier, qui est créé à partir de la sortie de cette commande.

Clarifications :

  • entrée standard : un "fichier" (pas vraiment, mais sous linux tout se comporte comme un fichier) qui, lorsqu'il est lu, contient comme par magie ce que vous avez tapé.
  • sortie standard : un "fichier" qui, lorsqu'il est écrit, sera imprimé sur le terminal virtuel.
  • (c'est-à-dire < o <() ) : Comme dans les mathématiques régulières, les expressions des opérateurs et des opérandes seront évaluées et substituées. 3+2*3 se transforme en 5*3 se transforme en 15. C'est la même chose dans le langage bash.

Un bel exemple pour souligner le point de vue de Roger est cette expression :

if [ -f my_condition ] then something fi

Ici, le contenu des parenthèses sera évalué comme une déclaration conditionnelle, c'est-à-dire que si ma_condition est vraie, alors faites quelque chose. Mais : [ est en fait juste un alias du programme test qui, lorsqu'il est appelé avec le paramètre -f, vérifie si un fichier existe.

2voto

ShawnD Points 519

Pour clarifier le point de Stefano, le deuxième < n'est pas juste un <, c'est en fait <()

Vous connaissez peut-être déjà une construction similaire, $(), qui produit une chaîne de caractères correspondant au résultat de la commande qu'elle contient. Ainsi :

$ which bash # echo the path to bash
/bin/bash
$ ldd $(which bash) # return which libraries bash is linked to
...

Après la substitution de la chaîne de caractères, ceci est équivalent à

ldd /bin/bash

Comme le dit Stefano, <() fait une chose très similaire mais renvoie un descripteur de fichier.

Vous pouvez trouver la documentation de bash dans man bash . Comme il s'agit d'une énorme page de manuel, vous pouvez chercher (appuyer sur / ) pour <\( (vous devez échapper à la parenthèse ouverte - en recherchant <( ne fonctionnera pas).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X