Кошачий файл |... vs... <файл - программирование
Подтвердить что ты не робот

Кошачий файл |... vs... <файл

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

4b9b3361

Ответ 1

При чтении из обычного файла 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%

Ответ 2

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

Ответ 3

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

zipinfo /dev/stdin < thezipfile.zip

и

cat thezipfile.zip | zipinfo /dev/stdin

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

Ответ 4

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

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

Ответ 5

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

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

против

while read line
do
  ...
done < foo
echo "$line"

Ответ 6

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

Ответ 7

Еще одно отличие - это поведение при блокировке 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 быть достаточно сложным, чтобы открыть свой собственный флакон без блокировки?)