J'essaie d'utiliser les named pipes comme un moyen pratique de prétraiter les entrées à la volée pour les pipelines qui, malheureusement, n'acceptent pas directement les données de stdin.
Partout où je cherche des informations, j'obtiens essentiellement la même chose : Les tuyaux nommés doivent être très simples à utiliser.
L'essentiel est que ce qui suit devrait fonctionner :
mkfifo mynamedpipe echo "is this working?" > mynamedpipe cat mynamedpipe
quand j'exécute mkfifo mynamedpipe
le tuyau est créé avec succès et visible avec ls *
.
Mais même après m'être accordé la permission d'écrire sur ce tube, quand j'essaie d'exécuter echo "whatever" > mynamedpipe
rien ne se passe et le terminal se bloque jusqu'à ce que je tue le processus avec ctrl+c
.
J'ai ce problème sur ma machine linux locale (Ubuntu 14.04.5 LTS) ainsi que sur un serveur public (Red Hat Enterprise Linux 7), et en zsh ainsi qu'en bash.
Qu'est-ce que je fais de mal ici ?
1 votes
Essayez
cat < mynamedpipe
. notez également cette citation de linuxjournal.com/article/2156 : "Si vous regardez attentivement, vous remarquerez que la première commande que vous exécutez semble se bloquer. Cela se produit parce que l'autre extrémité du tuyau n'est pas encore connectée, et donc le noyau suspend le premier processus jusqu'à ce que le second processus ouvre le tuyau. Dans le jargon Unix, on dit que le processus est "bloqué", car il attend que quelque chose se passe."0 votes
Merci, cela clarifie les choses pour moi. Mais il est ennuyeux que pratiquement tous les tutoriels sur ce sujet (ou du moins tous les résultats les plus importants sur Google) décrivent exactement les étapes de base que j'ai postées ci-dessus, en indiquant qu'elles devraient fonctionner "telles quelles", sans jamais aborder ce problème. Est-ce quelque chose qui a changé ces derniers temps ?
0 votes
Vous devez utiliser le lecteur (
cat mynamedpipe
) premièrement . Ce qui signifie que vous avez besoin de deux terminaux. Aussi, ça sent comme un Question XY . Veuillez expliquer le problème réel que vous essayez de résoudre : Quels sont ces "pipelines qui, malheureusement, n'acceptent pas directement les données de stdin" exactement ?