46 votes

Bash : créer un fifo anonyme

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 ?

0voto

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

-1voto

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 .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X