web-dev-qa-db-fra.com

redirection du résultat de la commande en utilisant '- <<(...)'

J'avais besoin d'extraire un shasum. Cela fonctionne, mais quelqu'un peut-il expliquer pourquoi?

sed 's/^.*= //' -< <(openssl dgst -sha256 filename)

Je connais bien la construction $( ), mais je ne trouve pas de documentation pour <( ), associée à -<, qui, je suppose, redirige vers la sed STDIN.

Je sais qu'il existe des moyens plus faciles, mais cette construction m'échappe.

8
GlenH

Le

<(openssl dgst -sha256 filename)

construct est un substitution de processus. Il crée un fichier (ou FIFO) en coulisse et renvoie son nom à la séquence de commandes.

< 

est une redirection de fichier normale, redirigeant le contenu du fichier d’arrière-plan vers stdin et

-

est un espace réservé reconnu par sed pour indiquer que son entrée provient de stdin.

Puisque sed est parfaitement capable de lire des fichiers, le -< semble inutile dans ce contexte;

sed 's/^.*= //' <(openssl dgst -sha256 filename)

devrait fonctionner aussi bien.

8
steeldriver

La construction <( COMMAND ) Bash est appelée substitution de processus .

Il évalue la COMMAND inside et redirige sa sortie vers une FIFO, un canal nommé qui obtient un descripteur de fichier virtuel à l'intérieur de /dev/fd attribué. Il agit comme un fichier temporaire contenant le résultat de la commande évaluée.


La construction < Bash est appelée redirection d'entrée .

Il prend un descripteur de fichier du côté droit et redirige son contenu vers le STDIN (entrée standard) de la commande du côté gauche.


- n'est pas une construction Bash mais un argument pour sed qui spécifie son fichier d'entrée. La valeur spéciale - signifie lire à partir de STDIN (qui est également la valeur par défaut de sed, de sorte qu'il pourrait être omis).


sed 's/^.*= //' - < <(openssl dgst -sha256 filename)

Cette ligne exécute d’abord openssl dgst -sha256 filename et met en cache sa sortie dans une FIFO. Le descripteur de fichier représentant ce canal nommé est traité comme un fichier d'entrée qui est redirigé vers le STDIN de sed 's/^.*= //' -. Cette commande sed lit dans STDIN et supprime tous les caractères précédant un symbole "=" suivi d'un espace.

7
Byte Commander