Dlaczego polecenie „czas” nie działa z żadną opcją?

60

Próbowałem użyć timepolecenia z -fopcją sformatowania wyniku czasu, ale pojawia się następujący błąd:

-f: command not found

Potem starał się korzystać z innych opcji -a, -oitp i uzyskać ten sam błąd. Nawet time --versionnie działa ( --version: command not found).

Nie mów mi, żebym czytał tego człowieka, ponieważ już to robię wiele razy ... Wszystkie te opcje są tam określone. Gdzie więc może być problem?

użytkownik258266
źródło
Czy sudo apt-get install --reinstall timepomaga
jobin
9
A może wewnętrzna powłoka timez/usr/bin/time
Rmano

Odpowiedzi:

90

Cóż, nawet jeśli ci się nie spodoba, sprawię, że będziesz czytać ponownie z większą uwagą man time. Na końcu EXAMPLESrozdziału znajdziesz:

  Users of the bash shell need to use an explicit path in order to run
  the external time command and not the shell builtin variant.  On system
  where time is installed in /usr/bin, the first example would become
       /usr/bin/time wc /etc/hosts

Zakładam, że używasz powłoki bash, która korzysta z wewnętrznej wersji timesłowa kluczowego powłoki. Możesz to sprawdzić za pomocą następującego polecenia:

type time

a wynik będzie prawdopodobnie:

time is a shell keyword

Jeśli jest to przypadek, to jest jasne, do korzystania prawdziwe time polecenia, należy użyć swojej wyraźnej ścieżki: /usr/bin/time.

Ponadto, jeśli nie chcesz już używać słowa kluczowego shell time, możesz utworzyć stały alias w następujący sposób:

alias time='/usr/bin/time'

Spowoduje to zastąpienie słowa kluczowego powłoki, timeponieważ polecenie:

type time

da teraz następujące dane wyjściowe:

time is aliased to `/usr/bin/time'
Radu Rădeanu
źródło
5
dla poleceń wbudowanych w powłokę: {info time} i {type time}. W przypadku poleceń binarnych: {when time} i {man time}
Michael Martinez
@Michael info timemówi o pliku binarnym. help timedotyczy wbudowanego.
wjandrea
tak, przepraszam, myślałem o „pomocy”, ale wyszło „info”
Michael Martinez,
21

Ponieważ, jak wyjaśniają inne odpowiedzi, timejest słowem kluczowym powłoki, jedyną dostępną opcją jest -p:

terdon@oregano ~ $ help time
time: time [-p] pipeline
    Report time consumed by pipeline's execution.

Execute PIPELINE and print a summary of the real time, user CPU time,
and system CPU time spent executing PIPELINE when it terminates.

Options:
  -p    print the timing summary in the portable Posix format

Musisz uruchomić timeto /usr/bin. Oto kilka sposobów, aby to zrobić:

  • timeZamiast tego użyj pliku wykonywalnego:

    /usr/bin/time -f %Uuser ls >/dev/null
  • Użyj, \która powoduje, że powłoka ignoruje aliasy i słowa kluczowe, a zamiast tego szuka $PATHpasującego pliku wykonywalnego:

    \time -f %Uuser ls >/dev/null 
  • Użyj commandwbudowanego, który ma podobny efekt:

    command time -f %Uuser ls >/dev/null
  • Użyj innej powłoki, takiej, która nie ma takiego słowa kluczowego. Na przykład sh(który jest w rzeczywistości dashna Ubuntu):

    sh -c "time -f %Uuser ls >/dev/null"
  • Użyj which, który przeszuka twoje $PATH(OK, ten jest głupi):

    $(which time) -f %Uuser ls >/dev/null
terdon
źródło
Czy istnieje sposób, aby zrobić coś przeciwnego - replikacja wbudowana w timeregularne /usr/bin/time? Tłumaczy skrypt bash na myślnik.
Dan M.
@DanM. Nie rozumiem. Jeśli chcesz wbudowane time, uruchom time. Jeśli chcesz autonomiczny plik wykonywalny, uruchom /usr/bin/time.
terdon
timeo ile wiem, nie ma wbudowanej domyślnej powłoki Ubuntu. Chcę przetłumaczyć skrypt za pomocą wbudowanego na samodzielny z tym samym zachowaniem.
Dan M.
@DanM. to po prostu użyj time. Zadzwoni, którykolwiek jest dostępny. To będzie wbudowane w bash i samodzielne dla dash. Jeśli używasz /usr/bin/time, to zawsze będzie wywoływał autonomiczny, zarówno w bash, jak i w desce rozdzielczej. Ale wygląda na to, że prawdopodobnie powinieneś zadać nowe pytanie, wyjaśniając potrzebne zachowanie. Daj mi znać, jeśli to zrobisz, a ja postaram się pomóc.
terdon
tak, ale wbudowane i autonomiczne mają drastycznie inną składnię / semantykę. W każdym razie dzięki. Zadam nowe pytanie, jeśli nie wymyślę, jak sobie z tym poradzić.
Dan M.
17

bashI zshmuszle mają swoje wewnętrzne timepolecenie. Musisz użyć

/usr/bin/time -f ...

BTW, odkryłem, że używając (z zsh):

~% which  time
time: shell reserved word
Rmano
źródło