Ce n'est pas une entrée standard multiple. C'est un bashisme qui s'appelle 'Process Substitution' http://tldp.org/LDP/abs/html/process-sub.html
Il crée un pseudo fichier (/dev/fd/something
) pour chaque remplacement. C'est plutôt utile. La commande ne peut être lue que comme un flux, ce qui signifie qu'elle ne peut pas aller et venir avec fseek. Il doit le lire comme un flux d'octets, comme un tube.
Réponse BONUS
Vous n'avez pas besoin d'en faire trop pour l'utiliser. En ce qui concerne votre script, il obtient un nom de fichier valide sur la ligne de commande, qui peut être ouvert () comme n'importe quoi d'autre. Comme d'autres l'ont dit, vous verriez diff /dev/fd/XX /dev/fd/YY
. Si vous faites un stat() sur l'un de ces pseudo-fichiers, vous verrez qu'il s'agit d'un tube nommé, et vous devriez le traiter avec la sémantique du tube - à savoir pas de fseek() ou ftell(). Si vous faites un test stat() pour voir explicitement s'il s'agit d'un fichier (par exemple [ -f $1 ]
) cela va break - ceci est implémenté comme un tube nommé après tout.
<(...)
traite la substitution en bas. La sortie du processus entre parenthèses est envoyée à un descripteur de fichier supplémentaire au-delà du 3 normal, et un nom de fichier est renvoyé correspondant à ce descripteur de fichier. De cette manière, la sortie d'une commande peut être traitée comme un nom de fichier à transmettre à une autre commande.
Il y a un stdin
et un stdout
pour chaque processus . Ils sont généralement connectés au terminal, mais ils peuvent être redirigés séparément les uns des autres.
Dans l'exemple, il y a deux wget
processus impliqués, chacun ayant son propre stdin
et stdout
. Chaque wget
le processus écrit dans -
, qui est son stdout
. Puis bash
substitution de processus <(...)
relie le stdout
du processus vers un pseudo-fichier unique, à partir duquel diff
Peux lire. Notez que les deux substitutions de processus produisent deux pseudo-fichiers différents ! Ainsi, diff
voit quelque chose comme :
diff /dev/fd/XX /dev/fd/YY
où le stdout
de wget -q -O - URL1
est connecté au /dev/fd/XX
, et le stdout
de wget -q -O - URL2
à /dev/fd/YY
.