Почему формат вывода времени зависит от того, как я его называю

14

Это может быть вопрос новичка, но я не понимаю, как это настроено и почему формат вывода timeкоманды отличается в этих двух случаях:

если используется с помощью time, вывод три строки с базовой информацией

$ time sleep 1

real    0m1.003s
user    0m0.000s
sys     0m0.000s

тогда я могу проверить, какой двоичный файл используется

$ which time
/usr/bin/time

и вызвать его напрямую, чтобы получить вывод в совершенно другом формате, с гораздо большей информацией

$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 2000maxresident)k
0inputs+0outputs (0major+77minor)pagefaults 0swaps

нет псевдонимов, связанных с time

$ alias | grep time
$ 

Я бегу Ubuntu 16.04.

XAXA
источник
Вот почему whichв основном бесполезно ...
Бакуриу

Ответы:

23

Первое - это bashсобственное встроенное ключевое слово time(скомпилировано с bash), а второе - внешний исполняемый файл time( /usr/bin/time, поставляется с timeпакетом).

Кроме того, whichневозможно отобразить встроенные команды оболочки или ключевые слова, поскольку она просто просматривает PATH, вам нужно использовать typeэто. Будучи встроенной в оболочку, она typeможет дополнительно проверять внутренние сущности оболочки (а также PATH), поэтому вы можете определить разницу следующим образом:

type -a time

Вот:

$ type -a time
time is a shell keyword
time is /usr/bin/time

Первый будет выполнен, если вы просто используете time. Вы также можете получить то, что выполняется, просто используя type(без -a):

type time

-aГоворит typeискать во внутренних сущностях интерпретатора , а также в PATHто поиск во всех возможных источниках.

Если по какой-то причине вам нужен внешний, используйте любой из:

\time
"time"
'time'
command time
heemayl
источник
ах, я так понимаю, whichне учитывает встроенные функции? И я всегда должен проверить type -aсначала. На самом деле, это , кажется , typeпревосходит , whichпотому что он выводит расположение , /usr/bin/timeа также
XAXA
@xaxa Да, проверь мои правки.
Heemayl
спасибо за подробный ответ! Что whichдля этого полезно?
xaxa
1
@xaxa typeдействительно лучше - если вы используете bash. В другой оболочке может не быть ни typeбулитина, ни timeвстроенного.
jpaugh
2
@jpaugh Не совсем верно. POSIX позволяет timeбыть только внешним, но не доступен type, typeдоступен во всех POSIX-совместимых оболочках.
Heemayl
4

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

bash$ time echo blah | sleep 3
real    0m3.002s
...
bash$ /usr/bin/time echo blah | sleep 3
0.00user 0.00system 0:00.00elapsed ?%CPU 
...
bash$ time for x in 1 2 3 ; do sleep 1 ; done
real    0m3.006s
...

Хотя время указано в стандарте, оно не определено, как оно должно действовать в конвейере, поэтому возможна более мощная внутренняя реализация, подобная этой.

ilkkachu
источник