cat foo | somecmd
выполняет две программы - /bin/cat
и somecmd
;и подключение стандартного вывода cat
к стандартному вводу somecmd
с помощью FIFO - который может быть прочитан только один раз, от начала до конца.Этот FIFO также не предоставляет метаданных об исходном файле - ни его имя, ни его размер не могут быть обнаружены с помощью somecmd
(без учета размера до конца чтения; это делает cat foo | tail
смехотворно медленным для мульти-GB файл).
somecmd <foo
работает только с одной программой - somecmd
- подключает свой стандартный ввод к прямому дескриптору файла foo
.Таким образом, он может скопировать этот дескриптор, перемотать и перечитать его, передать подмножества файла различным потокам для параллельной обработки, отобразить файл в память для произвольного доступа и т. Д.
CommonТакие программы, как GNU sort
, wc -c
, tail
и shuf
, могут работать намного эффективнее, если использовать реальный, доступный для поиска дескриптор файла, а не FIFO.
Всегда useперенаправление непосредственно из файла, а не cat
, использующего этот файл, если у вас нет особых и веских причин поступать иначе.
В качестве примера такой веской причины (где вы можете использоватьcat
), рассмотрим случай, когда вам нужно потоковое воспроизведение файла, доступного только для чтения для более привилегированной учетной записи пользователя.
sudo -u someuser /bin/cat -- /path/to/somefile | somecmd
... позволяет somecmd
работать с вашими исходными, не повышенными привилегиямиТаким образом, /etc/sudoers
можно настроить так, чтобы исходная команда выполняла только этот отдельный конкретный вызов cat
.