comm -23 <(sort -u A) <(sort -u B)
Sympa, je ne connaissais pas comm. Mais du coup je n'ai plus besoin de faire
<(...) appelé "process substitution" est une fonctionalité
non-standard de zsh, bash et certains ksh.
Vu qu'en interactif, j'utilise uniquement zsh et bash, ça me va. Pour ls
sort -u A | { exec 3<&0; sort -u B | comm -23 /dev/fd/3 -; }
Hum, ça atteint mes limites là. Alors si je comprends un peu, /dev/fd/N sont
comm -23 <(sort -u A) <(sort -u B)
Sympa, je ne connaissais pas comm. Mais du coup je n'ai plus besoin de faire
<(...) appelé "process substitution" est une fonctionalité
non-standard de zsh, bash et certains ksh.
Vu qu'en interactif, j'utilise uniquement zsh et bash, ça me va. Pour ls
sort -u A | { exec 3<&0; sort -u B | comm -23 /dev/fd/3 -; }
Hum, ça atteint mes limites là. Alors si je comprends un peu, /dev/fd/N sont
comm -23 <(sort -u A) <(sort -u B)
Sympa, je ne connaissais pas comm. Mais du coup je n'ai plus besoin de faire
<(...) appelé "process substitution" est une fonctionalité
non-standard de zsh, bash et certains ksh.
Vu qu'en interactif, j'utilise uniquement zsh et bash, ça me va. Pour ls
sort -u A | { exec 3<&0; sort -u B | comm -23 /dev/fd/3 -; }
Hum, ça atteint mes limites là. Alors si je comprends un peu, /dev/fd/N sont
Le (on) samedi 24 novembre 2007 14:25, Stephane Chazelas a écrit (wrote) :comm -23 <(sort -u A) <(sort -u B)
Sympa, je ne connaissais pas comm. Mais du coup je n'ai plus besoin de faire
un sort -u avant, non ? (Je peux toujours en faire un après si je veux la
sortie triée :
comm -23 A B | sort -u
mais ce n'est plus un préliminaire indispensable à la comparaison, on
dirait.)
Vu qu'en interactif, j'utilise uniquement zsh et bash, ça me va. Pour ls
scripts, je peux faire un effort.sort -u A | { exec 3<&0; sort -u B | comm -23 /dev/fd/3 -; }
Hum, ça atteint mes limites là. Alors si je comprends un peu, /dev/fd/N sont
les fameux "file descriptor" dont les plus connus sont la sortie standard
(1) et la sortie d'erreur (2). Visiblement 3<&0 redirige le flux 0 (sortie
standard ?) sur le fd3. Donc sur /dev/fd3, comm va lire la sortie du sort
B, sur -, à savoir l'entrée standard.
Là où je rame complètement, c'est sur le rôle du exec, le groupement des
différents processus et son influence sur les entrées et sorties standard
de chacun. Je peux demander une petit explication ?
Sinon, j'imagine bien sûr que l'avantage de cette syntaxe, c'est qu'elle est
standard et protable ?
[...]
Le (on) samedi 24 novembre 2007 14:25, Stephane Chazelas a écrit (wrote) :
comm -23 <(sort -u A) <(sort -u B)
Sympa, je ne connaissais pas comm. Mais du coup je n'ai plus besoin de faire
un sort -u avant, non ? (Je peux toujours en faire un après si je veux la
sortie triée :
comm -23 A B | sort -u
mais ce n'est plus un préliminaire indispensable à la comparaison, on
dirait.)
Vu qu'en interactif, j'utilise uniquement zsh et bash, ça me va. Pour ls
scripts, je peux faire un effort.
sort -u A | { exec 3<&0; sort -u B | comm -23 /dev/fd/3 -; }
Hum, ça atteint mes limites là. Alors si je comprends un peu, /dev/fd/N sont
les fameux "file descriptor" dont les plus connus sont la sortie standard
(1) et la sortie d'erreur (2). Visiblement 3<&0 redirige le flux 0 (sortie
standard ?) sur le fd3. Donc sur /dev/fd3, comm va lire la sortie du sort
B, sur -, à savoir l'entrée standard.
Là où je rame complètement, c'est sur le rôle du exec, le groupement des
différents processus et son influence sur les entrées et sorties standard
de chacun. Je peux demander une petit explication ?
Sinon, j'imagine bien sûr que l'avantage de cette syntaxe, c'est qu'elle est
standard et protable ?
[...]
Le (on) samedi 24 novembre 2007 14:25, Stephane Chazelas a écrit (wrote) :comm -23 <(sort -u A) <(sort -u B)
Sympa, je ne connaissais pas comm. Mais du coup je n'ai plus besoin de faire
un sort -u avant, non ? (Je peux toujours en faire un après si je veux la
sortie triée :
comm -23 A B | sort -u
mais ce n'est plus un préliminaire indispensable à la comparaison, on
dirait.)
Vu qu'en interactif, j'utilise uniquement zsh et bash, ça me va. Pour ls
scripts, je peux faire un effort.sort -u A | { exec 3<&0; sort -u B | comm -23 /dev/fd/3 -; }
Hum, ça atteint mes limites là. Alors si je comprends un peu, /dev/fd/N sont
les fameux "file descriptor" dont les plus connus sont la sortie standard
(1) et la sortie d'erreur (2). Visiblement 3<&0 redirige le flux 0 (sortie
standard ?) sur le fd3. Donc sur /dev/fd3, comm va lire la sortie du sort
B, sur -, à savoir l'entrée standard.
Là où je rame complètement, c'est sur le rôle du exec, le groupement des
différents processus et son influence sur les entrées et sorties standard
de chacun. Je peux demander une petit explication ?
Sinon, j'imagine bien sûr que l'avantage de cette syntaxe, c'est qu'elle est
standard et protable ?
[...]
mais sous Linux,
/dev/fd/3 est un fait un lien symbolique vers /proc/self/fd/3
(enfin, /dev/fd est un lien symbolique vers /proc/self/fd), et
/proc/self/fd/3 est un lien symbolique vers la resource ouverte
par le fd 3, donc pour les fichiers reguliers, faire un
open("/dev/fd/3") ouvre le fichier une deuxieme fois qui n'a
rien a voir avec faire un dup(3).
mais sous Linux,
/dev/fd/3 est un fait un lien symbolique vers /proc/self/fd/3
(enfin, /dev/fd est un lien symbolique vers /proc/self/fd), et
/proc/self/fd/3 est un lien symbolique vers la resource ouverte
par le fd 3, donc pour les fichiers reguliers, faire un
open("/dev/fd/3") ouvre le fichier une deuxieme fois qui n'a
rien a voir avec faire un dup(3).
mais sous Linux,
/dev/fd/3 est un fait un lien symbolique vers /proc/self/fd/3
(enfin, /dev/fd est un lien symbolique vers /proc/self/fd), et
/proc/self/fd/3 est un lien symbolique vers la resource ouverte
par le fd 3, donc pour les fichiers reguliers, faire un
open("/dev/fd/3") ouvre le fichier une deuxieme fois qui n'a
rien a voir avec faire un dup(3).
Stephane Chazelas wrote in message
<4749480b$0$5102$:mais sous Linux,
/dev/fd/3 est un fait un lien symbolique vers /proc/self/fd/3
(enfin, /dev/fd est un lien symbolique vers /proc/self/fd), et
/proc/self/fd/3 est un lien symbolique vers la resource ouverte
par le fd 3, donc pour les fichiers reguliers, faire un
open("/dev/fd/3") ouvre le fichier une deuxieme fois qui n'a
rien a voir avec faire un dup(3).
Ce n'est pas tout à fait vrai. Par exemple :
ssecem /tmp $ mkdir jail
ssecem /tmp $ cd jail
ssecem /tmp/jail $ exec 3> foo
ssecem /tmp/jail $ echo first line >&3
ssecem /tmp/jail $ chmod 000 /tmp/jail
ssecem /tmp/jail $ exec 4>> `readlink /proc/$$/fd/3`
zsh: permission denied: /tmp/jail/foo
ssecem /tmp/jail $ exec 4> /dev/fd/3
zsh: file exists: /dev/fd/3
ssecem /tmp/jail $ exec 4>> /dev/fd/3
Stephane Chazelas wrote in message
<4749480b$0$5102$ba4acef3@news.orange.fr>:
mais sous Linux,
/dev/fd/3 est un fait un lien symbolique vers /proc/self/fd/3
(enfin, /dev/fd est un lien symbolique vers /proc/self/fd), et
/proc/self/fd/3 est un lien symbolique vers la resource ouverte
par le fd 3, donc pour les fichiers reguliers, faire un
open("/dev/fd/3") ouvre le fichier une deuxieme fois qui n'a
rien a voir avec faire un dup(3).
Ce n'est pas tout à fait vrai. Par exemple :
ssecem /tmp $ mkdir jail
ssecem /tmp $ cd jail
ssecem /tmp/jail $ exec 3> foo
ssecem /tmp/jail $ echo first line >&3
ssecem /tmp/jail $ chmod 000 /tmp/jail
ssecem /tmp/jail $ exec 4>> `readlink /proc/$$/fd/3`
zsh: permission denied: /tmp/jail/foo
ssecem /tmp/jail $ exec 4> /dev/fd/3
zsh: file exists: /dev/fd/3
ssecem /tmp/jail $ exec 4>> /dev/fd/3
Stephane Chazelas wrote in message
<4749480b$0$5102$:mais sous Linux,
/dev/fd/3 est un fait un lien symbolique vers /proc/self/fd/3
(enfin, /dev/fd est un lien symbolique vers /proc/self/fd), et
/proc/self/fd/3 est un lien symbolique vers la resource ouverte
par le fd 3, donc pour les fichiers reguliers, faire un
open("/dev/fd/3") ouvre le fichier une deuxieme fois qui n'a
rien a voir avec faire un dup(3).
Ce n'est pas tout à fait vrai. Par exemple :
ssecem /tmp $ mkdir jail
ssecem /tmp $ cd jail
ssecem /tmp/jail $ exec 3> foo
ssecem /tmp/jail $ echo first line >&3
ssecem /tmp/jail $ chmod 000 /tmp/jail
ssecem /tmp/jail $ exec 4>> `readlink /proc/$$/fd/3`
zsh: permission denied: /tmp/jail/foo
ssecem /tmp/jail $ exec 4> /dev/fd/3
zsh: file exists: /dev/fd/3
ssecem /tmp/jail $ exec 4>> /dev/fd/3