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.
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.
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.