Почему подстановка процесса приводит к файлу с именем / dev / fd / 63, который является трубой?

Я пытаюсь понять именованные каналы в контексте этого конкретного примера.

Я набираю <(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 <() он перечисляет мне содержимое каталога.

Что происходит в случае именованного канала?

2 Solutions collect form web for “Почему подстановка процесса приводит к файлу с именем / dev / fd / 63, который является трубой?”

Когда вы выполняете <(some_command) , ваша оболочка выполняет команду в круглых скобках и заменяет все это файловым дескриптором, связанным с <(some_command) команды. Таким образом, /dev/fd/63 – это труба, содержащая вывод вашего вызова ls.

Когда вы выполняете <(ls -l) вы получаете ошибку Permission denied от Permission denied , потому что вся строка заменяется на канал, эффективно пытаясь вызвать /dev/fd/63 в качестве команды, которая не является исполняемой.

Во втором примере cat <(ls -l) становится cat /dev/fd/63 . Поскольку кошка читает файлы, указанные в качестве параметров, вы получаете контент. echo с другой стороны, просто выводит свои параметры «как есть».

В последнем случае <() просто заменяется ничем, так как нет команды. Но это не согласуется между оболочками, в zsh вы все равно получаете трубку (хотя и пустую).

Резюме : <(command) позволяет использовать вывод команды, где обычно требуется файл.

Изменить: как указывает Жиль , это не именованный канал, а анонимный канал. Основное различие заключается в том, что он существует только при условии, что процесс запущен, тогда как именованный канал (созданный, например, с mkfifo ) останется без подключенных к нему процессов.

Вы неправильно понимаете команду ls и перенаправление. ls перечисляет файлы и каталоги, указанные в командной строке, я не верю, что он принимает какие-либо данные от stdin. Перенаправление > >> и < – способы использования файла для ввода и сбора данных.

Linux и Unix - лучшая ОС в мире.