Я пытаюсь понять именованные каналы в контексте этого конкретного примера.
Я печатаю <(ls -l)
в своем терминале и получаю вывод как bash: /dev/fd/63: Permission denied
.
Если я наберу cat <(ls -l)
, я мог видеть содержимое каталога. Если я заменить cat
с echo
, я думаю , что я получаю имя терминала (или это?).
echo <(ls -l)
дает вывод как /dev/fd/63
.
Кроме того, этот пример вывода неясен для меня.
ls -l <(echo "Whatever")
lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -> pipe:[48078752]
Однако, если я дам, ls -l <()
он перечисляет мне содержимое каталога.
Что происходит в случае именованной трубы?
mkfifo
создает только именованный канал без содержимого. Так что вам нужно написать это самостоятельно (напримерmkfifo mypipe; ls > mypipe
). И да, записи в канал будут блокироваться до тех пор, пока какой-либо процесс не выполнит чтение из канала./dev/fd/63
это анонимный каналfile <(ls)
. Оболочка создает анонимный канал, но дескриптор файла отображается как именованный канал в/dev/fd
. Если бы это был анонимный канал, он не имел бы имени и не мог бы быть открыт командой, которой/dev/fd/63
передается./dev/fd
могут относиться к любому файлу дескриптор, даже анонимные каналы и сокеты, сетевые сокеты, сегменты разделяемой памяти и т. д.Вы неправильно понимаете как
ls
команду, так и перенаправление.ls
перечисляет файлы и каталоги, указанные в командной строке, я не верю, что он принимает какие-либо входные данные от стандартного ввода. Перенаправление>
>>
и<
способы использования файла для ввода и сбора выходных данных.источник
<(…)
это замена процесса.x|y
и почти идентично[num]<<REDIRECT
в некоторых оболочках. Отличие заключается в буквальной подстановке оболочки ссылки fd -/dev/fd/63
и т. Д. И в том, что она делает - или не делает - с помощью stdin. Сделайтеecho | readlink /dev/fd/0
и убедитесь сами.dev
ссылка - специальный файл. Вы можете сделать то же самое с любым файловым дескриптором в большинстве систем Linux - даже типично|pipes
, хотя я не ручаюсь за поведение в другом месте. я понимаю, откуда вы, но именованный канал - это отдельная вещь для себя - это ссылка файловой системы на канал в ядре - обычная ссылка на файловую систему, а не файл устройства./dev/fd/*
создания именованного канала где-то еще. Но я понимаю, что/dev/fd/*
сам по себе механизм отличается от собственно именованного канала. Кстати, описание Википедии может быть связано с объяснением этого различия./dev/fd/*
не доступно, bash создаст именованный канал/tmp
и использует его для подстановки процесса. Мне это не кажется странным, просто сделать функционал доступным в максимально возможном количестве сред.