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

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

Возможно, это вопрос новичка, но я не понимаю, как это настраивается и почему формат вывода 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.

решение1

Первое — это 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

решение2

Другое различие между встроенными и внешними утилитами заключается в том, что встроенные в Bashtime будет ли время завершения трубопроводовили вызовы функций оболочки (видимо, даже циклы, но руководство, похоже, этого не обещает). Внешняя часть 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
...

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

Связанный контент