Estoy tratando de entender las tuberías con nombre en el contexto de este ejemplo en particular.
Escribo <(ls -l)
en mi terminal y obtener la salida como, bash: /dev/fd/63: Permission denied
.
Si escribo cat <(ls -l)
, podría ver el contenido del directorio. Si reemplazo el cat
con echo
, creo que obtengo el nombre del terminal (¿o es así?).
echo <(ls -l)
da la salida como /dev/fd/63
.
Además, este resultado de ejemplo no está claro para mí.
ls -l <(echo "Whatever")
lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -> pipe:[48078752]
Sin embargo, si doy, ls -l <()
me enumera el contenido del directorio.
¿Qué está sucediendo en el caso de la tubería con nombre?
mkfifo
solo crea la tubería con nombre, sin ningún contenido. Por lo tanto, debe escribirlo usted mismo (por ejemplomkfifo mypipe; ls > mypipe
). Y sí, las escrituras en la tubería se bloquearán hasta que se lea algún proceso de la tubería./dev/fd/63
Es una tubería anónima.file <(ls)
. El shell crea una tubería anónima, pero el descriptor de archivo se refleja como una tubería con nombre/dev/fd
. Si se tratara de una tubería anónima, no tendría un nombre y no podría abrirse mediante un comando al que/dev/fd/63
se pasa./dev/fd
pueden referirse a cualquier archivo descriptor, incluso tuberías anónimos y enchufes, tomas de corriente de red, segmentos de memoria compartida, etc.Usted malinterpreta tanto el
ls
comando como la redirección.ls
enumera los archivos y directorios dados en la línea de comando, no creo que acepte ninguna entrada de stdin. Redirección>
>>
y<
son formas de utilizar un archivo para dar entrada y recopilar salida.fuente
<(…)
Es un proceso de sustitución.x|y
y casi idéntico al[num]<<REDIRECT
de algunas conchas. En lo que difiere es la sustitución literal del shell del enlace fd,/dev/fd/63
y etc., y lo que hace, o no hace, con stdin. Hazloecho | readlink /dev/fd/0
y compruébalo por ti mismo.dev
enlace - un archivo especial. puede hacer lo mismo con cualquier descriptor de archivo en la mayoría de los sistemas Linux, incluso lo típico|pipes
, aunque no responderé por el comportamiento en otros lugares. entiendo de dónde vienes, pero una tubería con nombre es una cosa separada en sí misma: es una referencia del sistema de archivos a una tubería en el núcleo: una referencia normal del sistema de archivos, no un archivo de dispositivo./dev/fd/*
crear una tubería con nombre en otro lugar. Pero considero que/dev/fd/*
es un mecanismo diferente al de una tubería con nombre propiamente dicho. Por cierto, la descripción de Wikipedia podría hacer una explicación de esta distinción./dev/fd/*
no está disponible, bash creará una tubería con nombre/tmp
y la usará para la sustitución del proceso. No me parece tan extraño, simplemente haciendo que la funcionalidad esté disponible en tantos entornos como sea posible.