В чем разница между `cat |` и `<` - PullRequest
0 голосов
/ 17 октября 2018

Я хотел бы отправить содержимое filename на some_cmd в командной строке.В чем разница между этим:

$ cat filename | some_cmd

и

$ some_cmd < filename

Есть ли случаи, когда я могу или должен использовать одно, а не другое?

1 Ответ

0 голосов
/ 17 октября 2018
  • 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.

...