Próbuję zrozumieć nazwane potoki w kontekście tego konkretnego przykładu.
Wpisuję <(ls -l)
w moim terminalu i uzyskać wyjście jako, bash: /dev/fd/63: Permission denied
.
Po wpisaniu cat <(ls -l)
mogłem zobaczyć zawartość katalogu. Jeśli mam wymienić cat
z echo
, myślę uzyskać nazwę terminala (lub nie?).
echo <(ls -l)
daje wynik jako /dev/fd/63
.
Również ten przykładowy wynik jest dla mnie niejasny.
ls -l <(echo "Whatever")
lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -> pipe:[48078752]
Jeśli jednak dam, ls -l <()
wyświetla mi zawartość katalogu.
Co się dzieje w przypadku nazwanej rury?
mkfifo
tworzy tylko nazwany potok, bez żadnej zawartości. Więc musisz do niego napisać (npmkfifo mypipe; ls > mypipe
.). I tak, zapisy do potoku będą blokowane, dopóki jakiś proces nie odczyta z potoku./dev/fd/63
jest anonimową fajką.file <(ls)
. Powłoka tworzy anonimowy potok, ale deskryptor pliku jest odzwierciedlany jako potok nazwany/dev/fd
. Gdyby był to anonimowy potok, nie miałby nazwy i nie mógłby zostać otwarty poleceniem, do którego/dev/fd/63
został przekazany./dev/fd
mogą odnosić się do dowolnego pliku deskryptor, nawet anonimowe potoki i gniazda, gniazda sieciowe, segmenty pamięci wspólnej itp.Nie rozumiesz zarówno
ls
polecenia, jak i przekierowania.ls
wyświetla listę plików i katalogów podanych w wierszu poleceń, nie sądzę, że akceptuje jakiekolwiek dane wejściowe ze standardowego wejścia. Przekierowanie>
>>
i<
sposoby wykorzystania pliku do wprowadzania danych wejściowych i zbierania danych wyjściowych.źródło
<(…)
jest substytucją procesu.x|y
i prawie identyczny z[num]<<REDIRECT
niektórymi pociskami. Różni się to dosłownym zastąpieniem linku fd przez powłokę -/dev/fd/63
i tak dalej, i tym, co robi - lub nie robi - ze standardowym. Zróbecho | readlink /dev/fd/0
i przekonaj się sam.dev
link - specjalny plik. możesz zrobić to samo z dowolnym deskryptorem pliku na większości systemów linuxowych - nawet typowym|pipes
, chociaż nie będę ręczyć za zachowanie gdzie indziej. Rozumiem, skąd pochodzisz, ale nazwany potok jest osobną rzeczą dla siebie - jest odniesieniem do systemu plików do potoku w jądrze - zwykłym odniesieniem do systemu plików, a nie plikiem urządzenia./dev/fd/*
tworzenia nazwanego potoku w innym miejscu. Uważam jednak, że/dev/fd/*
sam jest innym mechanizmem niż właściwa nazwana rura. Nawiasem mówiąc, opis Wikipedii może wyjaśnić to rozróżnienie./dev/fd/*
nie jest dostępne, bash utworzy nazwaną potok/tmp
i użyje go zamiast tego do podstawienia procesu. Nie wydaje mi się to takie dziwne, po prostu udostępniam funkcjonalność w jak największej liczbie środowisk.