J'essaie de comprendre les canaux nommés dans le contexte de cet exemple particulier.
Je tape <(ls -l)
dans mon terminal et obtenir la sortie comme, bash: /dev/fd/63: Permission denied
.
Si je tape cat <(ls -l)
, je pourrais voir le contenu du répertoire. Si je remplace le cat
avec echo
, je pense avoir le nom du terminal (ou est-ce?).
echo <(ls -l)
donne la sortie comme /dev/fd/63
.
En outre, cet exemple de sortie n'est pas clair pour moi.
ls -l <(echo "Whatever")
lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -> pipe:[48078752]
Cependant, si je donne, ls -l <()
il me liste le contenu du répertoire.
Que se passe-t-il dans le cas du tuyau nommé?
mkfifo
crée uniquement le canal nommé, sans aucun contenu. Vous devez donc écrire vous-même (par exemplemkfifo mypipe; ls > mypipe
). Et oui, les écritures sur le tuyau seront bloquées jusqu'à ce qu'un processus lise à partir du tuyau./dev/fd/63
est une pipe anonyme.file <(ls)
. Le shell crée un canal anonyme, mais le descripteur de fichier est reflété sous forme de canal nommé/dev/fd
. S'il s'agissait d'un canal anonyme, il n'aurait pas de nom et ne pourrait pas être ouvert par une commande à laquelle/dev/fd/63
est passée./dev/fd
peuvent faire référence à n'importe quel fichier. Descripteur, même des tuyaux et des sockets anonymes, des sockets réseau, des segments de mémoire partagée, etc.Vous comprenez mal la
ls
commande et la redirection.ls
répertorie les fichiers et les répertoires indiqués sur la ligne de commande, je ne pense pas qu’elle accepte les entrées de stdin. La redirection>
>>
et<
les moyens d'utiliser un fichier pour entrer et collecter des sorties.la source
<(…)
est une substitution de processus.x|y
et presque identique à celle[num]<<REDIRECT
de certains coquillages. Ce qui est différent, c’est la substitution littérale du shell avec le lien fd -/dev/fd/63
et cetera et ce qu’il fait - ou ne fait pas - avec stdin. Faitesecho | readlink /dev/fd/0
et voyez par vous-même.dev
lien - un fichier spécial. vous pouvez faire la même chose avec n'importe quel descripteur de fichier sur la plupart des systèmes Linux - même typique|pipes
, bien que je ne garantisse pas le comportement ailleurs. Je comprends d'où vous venez, mais un tube nommé est une chose distincte en soi - c'est une référence de système de fichiers à un tube dans le noyau - une référence de système de fichiers normale , pas un fichier de périphérique./dev/fd/*
créer un canal nommé ailleurs. Mais je prends l’argument qu’il/dev/fd/*
s’agit d’un mécanisme différent de celui d’un tuyau nommé proprement dit. Incidemment, la description de Wikipedia pourrait être expliquée par cette distinction./dev/fd/*
non disponible, bash crée un canal nommé/tmp
, et l'utilise pour la substitution de processus. Cela ne me semble pas si étrange, mais de rendre la fonctionnalité disponible dans autant d'environnements que possible.