Почему подстановка процесса приводит к файлу с именем / 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. Перенаправление > >> и < – способы использования файла для ввода и сбора данных.

Interesting Posts

Установка загрузчика grub в качестве загрузчика по умолчанию

Как использовать адрес содержимого в sed в osx без ошибки «ожидаемый контекстный адрес»

Команда, используемая в другой команде

Информация о версии PHP отсутствует в журнале Apache при запуске

Автоматически загружать пользовательскую функцию при запуске с помощью awk?

Как я могу объединить информацию из трех файлов для создания четвертой?

Сколько контроля над конкретными файловыми системами над кешем inode VFS и кешем буфера?

Вопрос о поведении контрольных клавиш

Могу ли я принудительно установить удаление пакета из yum repo?

Можете ли вы использовать grub для загрузки файла раздела RW, хранящегося на жестком диске FAT32?

Можно ли перенаправить X сеанса ssh на отображение подключенного vncviewer

найти команду в Linux

Список всех файловых систем и подвоев btrfs в оболочке

IBM DB2 для Linux AMD64 не устанавливается на Debian Jessie, журнал установки предлагает проблему с поставляемым IBM libdb2ure.so

Не удалось создать / монтировать swap во время автоматической установки Debian Jessie с использованием файла preseed

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