De ce poste en ligne de commande :
$ diff <(wget -q -O - URL1) <(wget -q -O - URL2)
On dirait plusieurs entrées standard mais --- si je me souviens bien de mon cours de Linux Porgramming --- ça ne peut pas être ça. Je pensais que, par définition, l'entrée standard était un flux.
Peut-être que cela a à voir avec stdin? Quelqu'un peut m'expliquer cela; peut-être fournir des liens vers la documentation.
Bonus: comment un script gérerait-il ces multiples flux? Si quelqu'un pouvait fournir un exemple Python ou Perl, ce serait très utile.
<(…)
; dans la syntaxe de substitution de processus Zsh est=(…)
.Réponses:
Ce n'est pas une entrée standard multiple. Il s'agit d'un bashisme qui a appelé «Substitution de processus» http://tldp.org/LDP/abs/html/process-sub.html
Il crée un pseudo fichier (
/dev/fd/something
) pour chaque substitution. C'est assez 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 tuyau.BONUS Answer
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 une stat () sur l'un de ces pseudo-fichiers, vous verrez qu'il s'agit d'un canal nommé, et vous devez le traiter avec la sémantique du tube - à savoir pas fseek () ou ftell (). Si vous faites un test stat () pour voir explicitement s'il s'agit d'un fichier (par exemple[ -f $1 ]
), cela se cassera - cela est implémenté comme un canal nommé après tout.la source
<(...)
traite la substitution dans bash. La sortie du processus dans les parens est envoyée à un descripteur de fichier supplémentaire au-delà de la normale 3, et un nom de fichier est retourné correspondant à ce descripteur de fichier. De cette façon, la sortie d'une commande peut être traitée comme un nom de fichier à passer à une autre commande.la source
Il y en a un
stdin
et unstdout
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 proprestdin
etstdout
. Chaquewget
processus écrit-
, ce qui est le sienstdout
. Ensuite,bash
la substitution de processus<(...)
relie lestdout
processus à un pseudo-fichier unique, à partir duqueldiff
peut être lu. Notez que les deux substitutions de processus produisent deux pseudo-fichiers différents! Ainsi,diff
voit quelque chose comme:où le
stdout
dewget -q -O - URL1
est connecté à/dev/fd/XX
, et lestdout
dewget -q -O - URL2
à/dev/fd/YY
.la source