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

В каталоге есть много файлов 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 
  • Сколько строк кода в этом файле?
  • Я хочу перезагрузить систему, как только был выполнен поиск, чтобы увидеть, что никто не зарегистрирован
  • Почему так медленно?
  • Почему «ls | wc -l "показать правильное количество файлов в текущем каталоге?
  • Подсчитывать строки без прерывания ввода
  • Как получить число символов в одном столбце?
  • Почему wc -m и wc -c разные?
  • `ls / | wc -l` указывает больше строк, чем `ls /` показывает
  • Отображение количества байтов, слов и строк в файле
  • Как подсчитать количество слов каждого предложения в файле с помощью команды оболочки?
  • команда, как wc, но с тиковым поведением
  • Interesting Posts

    Установка Git, Curl и Expat из источника

    Нажмите «Создать файл с другим владельцем»

    Монтаж ISO в Linux / KDE

    Как добавить точку в определенные строки в LaTeX-документе?

    KDE открывает файлы .deb с помощью ar вместо диспетчера пакетов

    ftrace не работает? Вероятно, простая ошибка

    Написание службы systemd для выполнения в резюме

    Запуск команды при входе в систему с помощью xmonad

    Какие разрешения я должен установить для исполняемого файла, я могу поделиться?

    Пожалуйста, помогите уточнить для меня роль и архитектуру Xorg (X-сервер) и взаимодействие с другим программным обеспечением

    расположение «идентификатора диска»

    извлекать линии в соответствии с конкретным столбцом

    Проверка прав на файл профиля в домашнем каталоге: должно ли это быть сделано?

    Есть ли способ определить, какой файл (сценарий, в частности) выполнил команду?

    Как я могу определить, если файл NTFS зашифрован?

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