Nous savons tous que mkfifo
et des pipelines. Le premier crée un nommée Il faut donc choisir un nom, très probablement avec le mot mktemp
et se rappeler plus tard de le dissocier. L'autre crée un tuyau anonyme, sans avoir à se soucier des noms et des suppressions, mais les extrémités du tuyau sont liées aux commandes du pipeline, et il n'est pas vraiment pratique de s'emparer des descripteurs de fichiers et de les utiliser dans le reste du script. Dans un programme compilé, je ferais simplement ret=pipe(filedes)
; dans Bash, il y a exec 5<>file
On pourrait donc s'attendre à quelque chose comme "exec 5<> -"
o "pipe <5 >6"
Existe-t-il quelque chose de ce genre dans Bash ?
Réponses
Trop de publicités?
eric
Points
11
En utilisant la réponse géniale et brillante de htamas, je l'ai légèrement modifiée pour l'utiliser dans un one liner, le voici :
# create a temporary named pipe
PIPE=(`(exec 0</dev/null 1</dev/null; (( read -d \ e < /proc/self/stat ; echo $e >&2 ; exec tail -f /dev/null 2> /dev/null ) | ( read -d \ e < /proc/self/stat ; echo $e >&2 ; exec tail -f /dev/null 2> /dev/null )) &) 2>&1 | for ((i=0; i<2; i++)); do read e; printf "$e "; done`)
# attach it to file descriptors 3 and 4
exec 3>/proc/${PIPE[0]}/fd/1 4</proc/${PIPE[1]}/fd/0
...
# kill the temporary pids
kill ${PIPE[@]}
...
# anything we write to fd 3 can be read back from fd 4
echo 'Hello world!' >&3
head -n1 <&4
...
# close the file descriptor when we are finished (optional)
exec 3>&- 4<&-
Oleg
Points
1
La réponse de htamas avec les commandes de queue fonctionne bien, mais il y a une condition de course. Voici une explication et un binaire qui la résout - https://github.com/Z-Wave-Me/mkpipe .
- Réponses précédentes
- Plus de réponses