Intereting Posts
Исправлено ли исправление shellshock bash базовыми инструментами командной строки, такими как echo и cat? Как получить поле в списке заданий bash с помощью awk? перенаправление веб-сервера? Как восстановить файл casper-rw в разделе casper-rw sudo для пользователей с пустыми паролями Драйвер сканера Brother x86 на малине Pi с QEMU и SANE Как создать резервную копию запущенной системы? Сканирование ~ / Скачивание при создании нового файла Условный оператор, «ожидаемый унарный оператор» Как передать поток ffmpeg в отдельный процесс Как фильтровать список файлов только для текстовых файлов? Какая программа постоянно читает электронные письма и может выполнять действия при определенных условиях? Как использовать временную переменную среды в bash for loop? wireshark Как я могу фильтровать элементы не в массиве? Автоматически приостанавливать громкость luks после задержки

Как мы можем заставить `time` применяться к конвейеру или его компоненту?

time command1 | command2 

Относится ли time к command1 или command1 | command2 command1 | command2 ? Если ваш ответ один из двух, как бы вы указали другой?

Не могли бы вы объяснить свой ответ на основе грамматики bash или того, как shell интерпретирует команду?

Когда shell анализирует команду, распознает ли она time как зарезервированное слово перед распознаванием | как управляющий оператор? Располагает ли порядок между распознаванием time как зарезервированного слова и распознаванием | как управляющий оператор определяет, относится ли time к command1 или command1 | command2 command1 | command2 ?

Благодарю.

 time command1 | command2 

Относится ли time к command1 или command1 | command2 command1 | command2 ?

time обычно реализуется двумя способами: как внешняя команда и как внутренняя особенность данной оболочки (я говорю «особенность», потому что это зависит от того, как shell реализует ее, хотя я видел это только как зарезервированное слово). Таким образом, при условии, что в системе есть хотя бы внешнее time , фактический ответ зависит от того, какую оболочку использует пользователь и, если применимо, от того, как time реализовано в такой оболочке .

В соответствии с тегами вы используете Bash в качестве оболочки, которая имеет внутреннее time , и я для простоты приму time GNU в качестве внешнего.

time баш:

  • Это зарезервированное слово.
  • Это относится ко всем трубопроводам.
  • Может использоваться с внутренними командами / функциями / зарезервированными словами.

time GNU:

  • Это внешняя команда.
  • Это относится к простым командам.
  • Его нельзя использовать с внутренними командами / функциями / зарезервированными словами, если они не были вызваны в оболочке.

В вашем конкретном сценарии, когда вы запускаете Bash, time относится к command1 | command2 command1 | command2 . Если вы использовали оболочку без внутреннего time но в системе присутствует внешнее time , оно будет применяться к command1 .


В: Если ваш ответ один из двух, как бы вы указали другой?

Применение time к command1 в Bash:

  • Использование { … } для ограничения объема времени:

     { time command1; } | command2 
  • Выполнение внешней команды time :

     # Using the `command` builtin command time command1 | command2 # Using `env` env time command1 | command2 # Escaping/quoting the `time` word \time command1 | command2 'time' command1 | command2 # Explicitly running the external `time` command /usr/bin/time command1 | command2 

Применение time к command1 | command2 command1 | command2 со time GNU:

  • Поместить конвейер во внешний файл и запустить его:

     time ./script.sh 
  • Вызов оболочки и запуск конвейера внутри нее:

     time sh -c 'command1 | command2' 

Q: Не могли бы вы объяснить свой ответ на основе грамматики bash или того, как shell интерпретирует команду?

Bash документирует свое time в главе 3.2.2 Pipelines своего руководства:

Формат для конвейера

 [time [-p]] [!] command1 [ | or |& command2 ] … 

Зарезервированное слово time вызывает вывод статистики времени для конвейера после его завершения.

Документация по time GNU доступна через info time и в man time :

Формат команды time :

 time [option...] COMMAND [ARG...] 

time запускает программу COMMAND , с любыми заданными аргументами ARG... Когда COMMAND заканчивается, time отображает информацию о ресурсах, используемых COMMAND .

POSIX документирует стандартное time , которое является основой для многих реализаций time :

СИНТАКСИС

 time [-p] utility [argument...] 

ОПИСАНИЕ

Утилита time должна вызывать утилиту, названную операндом utility с аргументами, предоставленными в качестве операндов argument и записывать сообщение о стандартной ошибке, в котором перечисляется статистика синхронизации для утилиты.

Когда time используется как часть конвейера, сообщаемое время не указывается, за исключением случаев, когда это единственная команда в команде группировки (см. Команды группировки ) в этом конвейере.

ОБОСНОВАНИЕ

В KornShell time – это зарезервированное для оболочки слово, которое можно использовать для определения времени всего конвейера, а не просто для простой команды. Определение POSIX было сформулировано так, чтобы разрешить эту реализацию.

Термин utility используется, а не command , чтобы подчеркнуть тот факт, что составные команды оболочки, конвейеры, специальные встроенные модули и т. Д. Не могут использоваться напрямую. Однако utility включает в себя пользовательские прикладные программы и сценарии оболочки, а не только стандартные утилиты.


Q: Когда shell анализирует команду, распознает ли она time как зарезервированное слово перед распознаванием | как управляющий оператор?

Хотя в руководстве Bash эта информация явно не упоминается, в POSIX четко указан порядок распознавания:

2.10.1. Грамматика лексических терминов

Язык ввода в оболочку должен быть сначала распознан на уровне символов. Полученные токены должны быть classифицированы по их непосредственному контексту в соответствии со следующими правилами (применяются по порядку). Эти правила должны использоваться для определения того, что такое «токен», который подлежит синтаксическому анализу на уровне токена. Применяются правила распознавания токенов в Token Recognition .

  1. Если токен является оператором, должен быть указан идентификатор токена для этого оператора.
  2. Если строка состоит только из цифр, а символ разделителя является одним из < или > , должен быть возвращен идентификатор токена IO_NUMBER .
  3. В противном случае получается идентификатор токена TOKEN .

Дальнейшее различие по TOKEN зависит от контекста. Может случиться так, что один и тот же TOKEN выдает WORD , NAME , ASSIGNMENT_WORD или одно из зарезервированных слов ниже, в зависимости от контекста.

Вкратце: операторы распознаются перед зарезервированными словами .


Q: Располагает ли порядок между распознаванием time как зарезервированного слова и распознаванием | как управляющий оператор определяет, относится ли time к command1 или command1 | command2 command1 | command2 ?

Не совсем, даже если time хранится как зарезервированное слово, его можно запрограммировать на применение к простым командам вместо целых конвейеров (хотя я не знаю ни одной оболочки, которая бы это делала). Важно то, как реализовано время, а не порядок его распознавания .