Dlaczego wyjściowy format czasu różni się w zależności od tego, jak go nazywam

14

To może być pytanie początkującego, ale nie rozumiem, jak to jest skonfigurowane i dlaczego format wyjściowy timepolecenia jest inny w tych dwóch przypadkach:

jeśli jest używany przez time, dane wyjściowe to trzy wiersze z podstawowymi informacjami

$ time sleep 1

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

wtedy mogę sprawdzić, który plik binarny jest używany

$ which time
/usr/bin/time

i wywołuj go bezpośrednio, aby uzyskać dane wyjściowe w zupełnie innym formacie, ze znacznie więcej informacji

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

nie ma żadnych aliasów związanych z time

$ alias | grep time
$ 

Biegnę Ubuntu 16.04.

xaxa
źródło
Dlatego whichjest w zasadzie bezużyteczny ...
Bakuriu

Odpowiedzi:

23

Pierwszy to bashwłasne słowo kluczowe time(skompilowane z bash), a drugi to zewnętrzny plik wykonywalny time( /usr/bin/timezawieratime pakietem).

Nie whichmożna też wyświetlać wbudowanych poleceń powłoki ani słów kluczowych podczas ich wyszukiwania PATH, należy do tego użyć type. Będąc wbudowaną powłoką, typemoże dodatkowo sprawdzać wewnętrzne jednostki powłoki (a także PATH), dzięki czemu można dostrzec różnicę poprzez:

type -a time

Tutaj:

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

Pierwszy zostanie wykonany, jeśli po prostu użyjesz time. Możesz także uzyskać, który jest wykonywany, używając type(bez -a):

type time

-aMówi typeszukać w jednostkach wewnętrznych powłoce przez, a także wPATH tj szukać we wszystkich możliwych źródeł.

Jeśli z jakiegoś powodu potrzebujesz zewnętrznego, użyj jednego z:

\time
"time"
'time'
command time
heemayl
źródło
ah, rozumiem, więc whichnie rozważa wbudowanych? I zawsze powinienem type -anajpierw sprawdzić . Rzeczywiście, wydaje się, typejest lepsza which, ponieważ wyświetla lokalizację /usr/bin/time, a także
xaxa
@xaxa Tak, sprawdź moje zmiany.
heemayl
dzięki za szczegółową odpowiedź! Do czego to jest whichprzydatne?
xaxa
1
@xaxa typejest rzeczywiście lepszy - jeśli używasz bash. Inna powłoka może nie mieć wbudowanej typelub timewbudowanej wersji.
jpaugh
2
@jpaugh Niezupełnie dobrze. POSIX pozwala timebyć zewnętrznym, ale nie type, typejest dostępny we wszystkich powłokach zgodnych z POSIX.
heemayl
4

Inną różnicą między wbudowanym a zewnętrznym narzędziem jest to, że wbudowane Bash time będzie w stanie dokończyć tworzenie potoków lub wywoływać funkcje powłoki (podobno nawet pętle, ale instrukcja nie wydaje się tego obiecać). Zewnętrzne timenie może, ponieważ będąc poza powłoką, nie wie o otaczającym kodzie.

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
...

Chociaż czas jest określony w standardzie, nie jest określone, jak powinien działać w potoku, więc możliwe jest bardziej wydajne wdrożenie wewnętrzne, takie jak to.

ilkkachu
źródło