Warum funktioniert der Befehl `time` mit keiner Option?

61

Ich habe versucht, den timeBefehl mit der -fOption zum Formatieren der Zeitausgabe zu verwenden, erhalte jedoch die folgende Fehlermeldung:

-f: command not found

Dann habe ich versucht , andere Optionen zu nutzen -a, -ousw. , und ich bekomme den gleichen Fehler. Nicht einmal time --versionfunktioniert nicht ( --version: command not found).

Sag mir nicht, ich soll den Mann lesen, weil ich es schon oft mache ... Alle diese Optionen sind dort angegeben. Wo könnte das Problem liegen?

user258266
quelle
Hilft das sudo apt-get install --reinstall time?
Jobin
9
Oder vielleicht die interne Shell timemit/usr/bin/time
Rmano

Antworten:

91

Nun, auch wenn Sie es nicht mögen, werde ich Sie wieder mit mehr Aufmerksamkeit zum Lesen bringen man time. Am Ende des EXAMPLESAbschnitts finden Sie:

  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

Ich gehe also davon aus, dass Sie eine Bash-Shell verwenden, die eine interne Version von verwendet time, die als Shell-Schlüsselwort bereitgestellt wird. Sie können dies mit dem folgenden Befehl überprüfen:

type time

und die Ausgabe wird wahrscheinlich sein:

time is a shell keyword

Wenn dies der Fall ist, dann ist klar, zu verwenden , den wirklichen time Befehl, müssen Sie seinen expliziten Pfad zu verwenden: /usr/bin/time.

Wenn Sie das Shell-Schlüsselwort nicht mehr verwenden möchten time, können Sie einen permanenten Alias wie folgt erstellen :

alias time='/usr/bin/time'

Dadurch wird das Shell-Schlüsselwort überschrieben, timeda der Befehl:

type time

wird nun die folgende Ausgabe geben:

time is aliased to `/usr/bin/time'
Radu Rădeanu
quelle
5
Für die Shell-Befehle: {info time} und {type time}. Für die binären Befehle: {welche Zeit} und {Mannzeit}
Michael Martinez
@Michael info timehandelt von der Binärdatei. help timegeht es um den eingebauten.
wjandrea
Tut mir leid, ich dachte "Hilfe", aber es kam "Info"
Michael Martinez
21

Da es sich, wie in den anderen Antworten erläutert, timeum ein Shell-Schlüsselwort handelt, haben Sie nur folgende Möglichkeiten -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

Sie müssen also das ausführen, in dem sich timedas befindet /usr/bin. Hier sind einige Möglichkeiten, dies zu tun:

  • Verwenden Sie timestattdessen die ausführbare Datei:

    /usr/bin/time -f %Uuser ls >/dev/null
  • Verwenden Sie \, wodurch Ihre Shell Aliase und Schlüsselwörter ignoriert und stattdessen nach $PATHeiner passenden ausführbaren Datei sucht :

    \time -f %Uuser ls >/dev/null 
  • Verwenden Sie das commandeingebaute, das einen ähnlichen Effekt hat:

    command time -f %Uuser ls >/dev/null
  • Verwenden Sie eine andere Shell, die kein solches Schlüsselwort enthält. Zum Beispiel sh(was eigentlich dashauf Ubuntu ist):

    sh -c "time -f %Uuser ls >/dev/null"
  • Benutze which, was dein durchsucht $PATH(OK, das ist albern):

    $(which time) -f %Uuser ls >/dev/null
terdon
quelle
Gibt es eine Möglichkeit, das Gegenteil zu tun - timemit regulären eingebauten replizieren /usr/bin/time? Dh, Bash-Skript in Bindestrich zu übersetzen.
Dan M.
@DanM. Ich verstehe nicht Wenn Sie das eingebaute wollen time, laufen Sie time. Wenn Sie die eigenständige ausführbare Datei möchten, führen Sie sie aus /usr/bin/time.
Terdon
timeSoweit mir bekannt ist, gibt es in Ubuntus Standard-Shell keine eingebauten Funktionen . Ich möchte ein Skript mit der integrierten Funktion in ein eigenständiges Skript mit demselben Verhalten übersetzen.
Dan M.
@DanM. dann einfach benutzen time. Es wird angerufen, welcher verfügbar ist. Das wird das Builtin für Bash und das Standalone für Dash sein. Wenn Sie verwenden /usr/bin/time, wird immer der Standalone aufgerufen, sowohl in Bash als auch in Dash. Aber es hört sich so an, als ob Sie wahrscheinlich eine neue Frage stellen und das Verhalten erklären sollten, das Sie benötigen. Lassen Sie es mich wissen und ich werde versuchen zu helfen.
Terdon
Ja, aber Built-in und Standalone haben drastisch unterschiedliche Syntax / Semantik. Trotzdem danke. Ich werde eine neue Frage stellen, wenn ich nicht weiß, wie ich damit umgehen soll.
Dan M.
17

Die bashund zshMuscheln haben ihren internen timeBefehl. Sie müssen verwenden

/usr/bin/time -f ...

Übrigens entdeckte ich das mit (von zsh):

~% which  time
time: shell reserved word
Rmano
quelle