Це залежить від команди. Деякі команди, що читаються з файлу, очікують, що файл буде звичайним файлом, розмір якого відомий заздалегідь, і який можна прочитати з будь-якої позиції та перемотати назад. Це малоймовірно, якщо вміст файлу - це список імен файлів: тоді команда, ймовірно, буде вміщуватись з трубою, яку вона просто читатиме послідовно від початку до кінця. Існує декілька способів подачі даних через трубу до команди, яка очікує імені файлу.
Багато команд трактують -
як спеціальне ім'я, тобто читати зі стандартного введення, а не відкривати файл. Це конвенція, а не зобов'язання.
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' *
надійніше - він буде друкувати кожен байт буквально у назвах файлів. Імена файлів, що містять нові рядки, все ще спричинять проблеми, але це неминуче, якщо команда очікує списку імен файлів, розділених новими рядками.