Какой код работает (со встроенными модулями )как в bash, так и в zsh с ключевым словом `time `?

если вы запускаете официальный образ докера ubuntu

docker run -it ubuntu  bash -i

запустите эту команду grep -v -e '^ #' -e '^$' /etc/apt/sources.list , чтобы показать, что у вас есть в ваш файл /etc/apt/sources.list .

см. man of grep(https://linux.die.net/man/1/grep)

вы должны увидеть эти строки:

deb http://archive.ubuntu.com/ubuntu/ bionic main restricted
deb http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted
deb http://archive.ubuntu.com/ubuntu/ bionic universe
deb http://archive.ubuntu.com/ubuntu/ bionic-updates universe
deb http://archive.ubuntu.com/ubuntu/ bionic multiverse
deb http://archive.ubuntu.com/ubuntu/ bionic-updates multiverse
deb http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ bionic-security main restricted
deb http://security.ubuntu.com/ubuntu/ bionic-security universe
deb http://security.ubuntu.com/ubuntu/ bionic-security multiverse

поэтому после запуска apt -получите обновление и после того, как вы можете запустить apt -получить установку emacs -nox vim nano

0
21.01.2020, 02:24
2 ответа

timeне синхронизирует команды. Из обоснования Единой спецификации Unix :

The term utility is used, rather than command, to highlight the fact that shell compound commands, pipelines, special built-ins, and so on, cannot be used directly.

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

Это связано с тем, что timeявляется , а не обязательным для специального синтаксиса оболочки или встроенной -командой. И варьировалось ли оно достаточно значительно во время первой стандартизации, и существенно ли различается сейчас.

  • В оболочках Almquist и (Heirloom )Bourne timeне является ни зарезервированным словом, ни построенным -в команде. Это внешняя команда, поэтому ее нельзя применить ни к чему, кроме простой команды . Внешняя команда timeна BSD использует информацию об использовании процесса, возвращенную из ядра библиотечной функцией wait4(), и требует, чтобы синхронизируемая программа была оболочкой, если вы хотите синхронизировать построенную -оболочку в командах и конвейерах.. Таким образом, такие вещи, как time bindkey, не находят утилиты для выполнения, а такие вещи, как time echo, измеряют время работы внешнейechoкоманды, а не оболочки, встроенной -в одну.
  • В оболочке C timeявляется встроенной -командой и не может применяться ни к чему, кроме простой команды . timeработает, просматривая результаты библиотечной функции wait4(), которая требует ожидания дочернего процесса. Таким образом, оболочка Ctimeвсегда разветвляет дочерний процесс , даже для других встроенных -команд. Вы обнаружите, что такие вещи, как time bindkey -v, ничего не дают, потому что они выполняются в дочернем процессе как следствие time.
  • В оболочках Korn и Bourne Again timeявляется зарезервированным словом в синтаксисе оболочки и может применяться к конвейерам. Эти оболочки не используют информацию об использовании дочерних процессов, возвращаемую библиотечной функцией wait4(), а вычисляют время, заключая в скобки вызовы команд с вызовами getrusage()и выполняя вычитания.
  • В оболочке Z timeявляется зарезервированным словом в синтаксисе оболочки и может применяться к конвейерам.Оболочка Z использует информацию об использовании процесса, возвращенную из ядра библиотечной функцией wait4(), но не вызывает разветвления для встроенных -команд. Таким образом, он ничего не сообщает , если ни один дочерний процесс не был разветвлен (, как в случае встроенного -в таких командах, какtrue); но, наоборот, такие, как time set -o vi, действительно чего-то достигают.

Как указано в ее обосновании, Единая спецификация Unix сформулирована свободно, чтобы разрешить все различные варианты поведения. И это указывает на то, что временная оболочка, встроенная -в команды, является проблемой.

3
28.01.2020, 02:29

В то время как большинство оболочек поддерживают синхронизацию внешних и встроенных команд, zsh не поддерживает синхронизацию для встроенных команд.

Если вам нужно получить результат времени, вы можете позвонить

time /bin/true

или отправьте отчет об ошибке людям из zsh.

С новой информацией все выглядит иначе.

Сложные команды синхронизации работают только в том случае, если timeявляется зарезервированным словом в оболочке.

Таким образом, у вас есть два ограничивающих фактора

  • оболочка должна иметь возможность синхронизировать встроенные команды

  • оболочка должна реализовать timeкак зарезервированное слово, улучшающее синтаксис оболочки

Это сокращает список потенциальных оболочек до:

bosh bash mksh ksh

Для встроенных команд оболочка должна знать, как измерять собственное время.

Для сложных команд оболочка должна реализовать timeвнутри интерпретатора.

0
28.01.2020, 02:29

Теги

Похожие вопросы