Использование встроенной команды «время» в bash вместо внешней команды

12

Работая с timeкомандой, я столкнулся с ситуацией, когда я должен использовать встроенную, timeа не внешнюю команду времени GNU /usr/bin/time. Итак, как я могу это сделать? Я где-то видел, что использование enableи / или commandпоможет, но они этого не сделали.

Это вариант использования:

watch "time ls"

который использует внешнюю /usr/bin/timeкоманду, которую я не хочу! Это происходит, когда timeпри запуске time lsна терминале вызывает внутреннюю функцию bash , например:

$ time ls

Обратите внимание, что прямо противоположный запрос был дан ответ здесь:

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

HO1
источник
watch 'bash -c "builtin time ls"'возможно?
Гленн Джекман
1
см. здесь о том, как заставить bash использовать встроенные функции, см. answer2 by Petr Utzl: builtin timeдолжно получиться.
Фиксиман
2
@Fiximan, timeне является встроенным bash, это зарезервированное слово языка, поэтому вы можете рассчитывать конвейеры (например time foo | bar) или составные команды (например time for i in...;done)
Стефан Шазелас

Ответы:

13

По умолчанию watchваша команда запускается /bin/sh -c '...'так, что вы видите, как /bin/shинтерпретировать timeкоманду. У тебя, /bin/shочевидно, нет встроенного time.

Чтобы запустить команду с другой оболочкой, используйте -xопцию, чтобы избавиться от значения по умолчанию, затем добавьте свой собственный явный вызов оболочки, встроенную в которую вы хотите.

watch -x bash -c 'time ls'
watch -x zsh -c 'time ls'

Независимо от того, как вы выполняете watch, команда, которую вы смотрите, не является дочерней для оболочки, которая выполняла watchкоманду, поэтому параметры оболочки не имеют прямого отношения.

Стефан Шазелас
источник