Это зависит от команды. Некоторые команды, которые читают из файла, ожидают, что файл будет обычным файлом, размер которого известен заранее, и который можно прочитать из любой позиции и перезаписать. Это маловероятно, если содержимое файла представляет собой список имен файлов: тогда команда, вероятно, будет содержать канал, который будет просто последовательно читать от начала до конца. Существует несколько способов передачи данных через канал в команду, которая ожидает имя файла.
Многие команды обрабатываются -
как специальное имя, означающее чтение из стандартного ввода, а не открытие файла. Это соглашение, а не обязательство.
ls | command -r -
Многие варианты Unix предоставляют специальные файлы, /dev
которые обозначают стандартные дескрипторы. Если /dev/stdin
существует, его открытие и чтение из него эквивалентно чтению из стандартного ввода; Точно так же, /dev/fd/0
если он существует.
ls | command -r /dev/stdin
ls | command -r /dev/fd/0
Если вашей оболочкой является ksh, bash или zsh, вы можете заставить оболочку заниматься выделением некоторого файлового дескриптора. Основным преимуществом этого метода является то, что он не привязан к стандартному вводу, поэтому вы можете использовать стандартный ввод для чего-то другого, и вы можете использовать его более одного раза.
command -r <(ls)
Если команда ожидает, что имя будет иметь конкретную форму (как правило, конкретное расширение), вы можете попытаться обмануть его с помощью символической ссылки.
ln -s /dev/fd/0 list.foo
ls | command -r list.foo
Или вы можете использовать именованный канал.
mkfifo list.foo
ls >list.foo &
command -r list.foo
Обратите внимание, что создание списка файлов с ls
проблемой является проблематичным, поскольку ls
имеет тенденцию искажать имена файлов, когда они содержат непечатаемые символы. printf '%s\n' *
более надежен - он печатает каждый байт буквально в именах файлов. Имена файлов, содержащие символы новой строки, все равно будут вызывать проблемы, но это неизбежно, если команда ожидает список имен файлов, разделенных символами новой строки.