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