Время, необходимое для вывода трубы на голову / хвост

В каталоге есть много файлов txt.

Если я делаю time wc -l *.txt | head time wc -l *.txt | head требуется

 real 0m0.032s user 0m0.020s sys 0m0.008s 

Если я делаю time wc -l *.txt | tail time wc -l *.txt | tail требуется

 real 0m0.156s user 0m0.076s sys 0m0.088s 

Означает ли это, что wc будет знать заранее, что он работает на трубе и будет считать только первые 10 файлов и сэкономить время? Другими словами, знает ли он о трубе? И разве это что-то особенное в отношении wc или применимо ко всем стандартным / встроенным командам?

3 Solutions collect form web for “Время, необходимое для вывода трубы на голову / хвост”

Я сделал strace на обеих командах. Интересным является то, что когда вы подключаете вывод к head , всего 123 системных вызова. С другой стороны, при подключении к хвосту есть 245 системных вызовов (или больше, когда есть больше файлов * .txt).

Дело: голова

Вот несколько последних строк при набивке на head :

 open("file12.txt", O_RDONLY) = 3 fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0 read(3, "", 16384) = 0 write(1, "0 file12.txt\n", 13) = -1 EPIPE (Broken pipe) --- SIGPIPE (Broken pipe) @ 0 (0) --- +++ killed by SIGPIPE +++ 

Когда wc пытается записать вывод 12-го файла, он получает сообщение об ошибке EPIPE . Вот почему head вышла после прохождения 11-й линии. Когда head выходит, wc получает SIGPIPE . Как видно из вывода strace выше, wc сначала пытается записать на этот канал (где head больше не читается) и получает сообщение об ошибке, что труба сломана.

Сигнал SIGPIPE отправляется процессу, когда он пытается записать в трубу без процесса, подключенного к другому концу. – из Википедии

Случай: хвост

При переходе к tail нет ничего подобного выше. wc заканчивается изящно после того, как записывает вывод в трубу, где tail должен быть подключен в течение всего времени. tail нуждается во всех строках, прежде чем он сможет распечатать последние 10 из них. Когда для чтения больше нет вывода, tail печатает строки и выходит изящно тоже

Любой процесс, который не блокирует SIGPIPE будет убит, если его выход будет SIGPIPE на конец записи, из которого никто не читает.

Таким образом, как только head закрывает свой вход (т. Е. Заканчивается), wc умирает, что занимает меньше времени, чем завершение всей работы.

Вы можете сделать это для исчезновения ваших файлов:

 time wc -l *.txt > tee | tail 

Но немного вы добавляете время для команды tee к time .

С tee command :

 root@debian:/home/mohsen/test# time wc -l *.txt > tee | tail real 0m0.005s user 0m0.000s sys 0m0.000s 

Без tee command :

 root@debian:/home/mohsen/test# time wc -l *.txt | tail 8 f3.txt 7 fi.txt 5 mydata.txt 4 newfile.txt 4 t1.txt 4 t2.txt 5 test.txt 4 text.txt 0 t.txt 49 total real 0m0.004s user 0m0.000s sys 0m0.000s 
  • Как получить число знаков препинания из файла
  • Как считать события фразы в grep, игнорируя случай?
  • Как использовать wc и piping для определения количества файлов и каталогов в определенном каталоге?
  • Рекурсивно печатать длину файла
  • Как найти файлы с тем же именем, но разные строки в двух каталогах?
  • `ls / | wc -l` указывает больше строк, чем `ls /` показывает
  • Подсчет количества строк в файле независимо от символа окончания строки
  • Почему так медленно?
  • Дополнительное пространство с подсчитанным номером строки?
  • Отправлять случайные данные через TCP на некоторое время и подсчитывать, сколько байтов было отправлено
  • Разделить входной файл на X частей общего количества строк / X
  • Interesting Posts

    Создать и открыть файл с помощью одной команды?

    Эти сообщения SELinux наводят на мысль о вторжении?

    Карта WiFi на новой сборке не распознается Linux Mint 17.3

    использовать basename в find -exec?

    Как использовать оболочку bash для gnuplot для отображения греческой буквы?

    Как удалить символ новой строки между двумя строками <font> \ n </ font> в unix?

    резервная база данных MSSQL на локальный диск клиента по сети

    Уменьшение физического объема LVM на вершине mdadm деградировало массив RAID, добавив запасную и восстановив его

    Управление сетью CLI

    Цикл через клиентов на обоих экранах в awesomewm

    Передача именованных аргументов в виде массива в сценарии оболочки

    Найти файлы рекурсивно, которые старше одного года и не принадлежат конкретному пользователю

    Как мне сказать `ps` использовать все доступные столбцы?

    Как восстановить отсутствующий файл / var / lib / dpkg / status?

    Ошибка компиляции rrdtool 1.4.7: glib-2.0 / glib.h

    Linux и Unix - лучшая ОС в мире.