кошачий файл | ... против ... <файл - PullRequest
15 голосов
/ 31 марта 2010

Есть ли случай ... или контекст, где cat file | ... ведет себя иначе, чем ... <file?

Ответы [ 7 ]

11 голосов
/ 31 марта 2010

При чтении из обычного файла cat отвечает за чтение данных, выполняет их по своему усмотрению и может ограничить способ записи в конвейер. Очевидно, что содержимое сохраняется, но все остальное может быть испорчено. Например: размер блока и время поступления данных. Кроме того, сам по себе канал не всегда нейтрален: он служит дополнительным буфером между входом и ....

Быстрый и простой способ сделать проблему размера блока очевидной:

$ cat large-file | pv >/dev/null
5,44GB 0:00:14 [ 393MB/s] [              <=>                                  ]
$ pv <large-file >/dev/null
5,44GB 0:00:03 [1,72GB/s] [=================================>] 100%
5 голосов
/ 31 марта 2010

cat позволит вам последовательно передавать несколько файлов. В противном случае перенаправление < и cat file | вызывают одинаковые побочные эффекты.

4 голосов
/ 31 марта 2010

Кроме того, что отправляют другие пользователи, при использовании перенаправления ввода из файла стандартный ввод - это файл, но при передаче вывода cat на вход стандартный ввод - это поток с содержимым файла. Когда стандартный ввод - файл, он сможет искать внутри файла, но канал не допустит этого. Вы можете убедиться в этом, найдя zip-файл и выполнив следующие команды:

zipinfo /dev/stdin < thezipfile.zip

и

cat thezipfile.zip | zipinfo /dev/stdin

Первая команда покажет содержимое zip-файла, а вторая покажет ошибку, хотя это вводит в заблуждение ошибка, поскольку zipinfo не проверяет результат вызова поиска и ошибки позже.

3 голосов
/ 29 августа 2011

A бесполезное использование кошки всегда следует избегать. Это как езда с ручником на . Это тратит впустую циклы процессора, ОС постоянно переключает контекст между процессом cat и следующим в канале. Если бы все бесполезные кошки в мире исчезли и перестали быть изобретенными, переизобретенными, передававшимися от отца к сыну, у нас не было бы глобального потепления, потому что мы могли бы легко жить с сэкономленной мощностью в 1,21 ГВт.

Спасибо. Я чувствую себя лучше. Пожалуйста, присоединяйтесь ко мне в моем крестовом походе, чтобы избавиться от бесполезного использования cat на stackoverflow. Этот сайт, насколько я понимаю, является важным вкладом в распространение бесполезных кошек. Я не виню новичков, но я хочу научить их. Рабочие и новички мира, ослабьте ручники и спасите планету !!! 1!

2 голосов
/ 15 августа 2012

Еще одним отличием является поведение при блокировке open() входного файла.

Например, если предположить, что вводом является FIFO без пишущих, один вызов не вызовет дочерние программы, пока не будет открыт входной файл, а другой вызовет два процесса:

prog ... < a_fifo      # 'prog' not launched until shell can open file
cat a_fifo | prog ...  # 'prog' and 'cat' are running (latter may block on open)

На практике это редко имеет значение, за исключением искусственных обстоятельств. prog может периодически регистрировать или выполнять некоторую работу по очистке, например, в ожидании ввода, что может потребоваться, даже если ввод недоступен. (Почему бы prog не было достаточно изощренным, чтобы открыть свой собственный неблокирующий ввод?)

2 голосов
/ 31 марта 2010

Трубы вызывают запуск подоболочки для команды справа. Это мешает переменным среды.

cat foo | while read line
do
  ...
done
echo "$line"

против

while read line
do
  ...
done < foo
echo "$line"
1 голос
/ 31 марта 2010

cat file | запускает другую программу (cat), которая не должна запускаться во втором случае. Это также делает его более запутанным, если вы хотите использовать «здесь документы». Но он должен вести себя так же.

...