redirection de sortie de commande en utilisant '- <<(…)'

10

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

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

Je connais la $( )construction, mais je ne trouve pas de documentation pour <( ), couplée à -<, qui, je suppose, redirige vers le sedSTDIN.

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

GlenH
la source

Réponses:

10

le

<(openssl dgst -sha256 filename)

construire est une substitution de processus . Il crée un fichier (ou FIFO) en arrière-plan et retransmet son nom à la séquence de commandes.

< 

est une redirection de fichier régulière, redirigeant le contenu du fichier en arrière-plan vers stdinet

-

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

Puisqu'il sedest parfaitement capable de lire à partir de fichiers, le -<semble inutile dans ce contexte;

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

devrait aussi bien fonctionner.

tournevis
la source
3
ou tout simplementopenssl ... | sed '...'
Miles
8

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

Il évalue l' COMMANDintérieur et redirige sa sortie vers un FIFO, un canal nommé qui obtient un descripteur de fichier virtuel à l'intérieur /dev/fdassigné. Il agit comme un fichier temporaire qui contient la sortie de la commande évaluée.


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

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


Le -n'est pas une construction Bash mais un argument poursed cela spécifie son fichier d'entrée. La valeur spéciale -signifie lire à partir de STDIN (qui est également sedla valeur par défaut, donc elle pourrait être omise).


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

Cette ligne s'exécute d'abord openssl dgst -sha256 filenameet met en cache sa sortie dans un 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 sedcommande lit à partir de STDIN et supprime tous les caractères devant un symbole "=" suivi d'un espace.

Byte Commander
la source