Timing der Ausführung eines Quellbefehls

Timing der Ausführung eines Quellbefehls

Ich versuche, die Ausführung meiner zsh-Dotfiles zu verbessern, und muss die Ausführung meiner Unterskripte zeitlich steuern. Ich habe einen Codeabschnitt in meinem, der .zshrcso aussieht:

typeset -U config_files
config_files=($DOTFILES/**/*.zsh)
for file in  ${(M)config_files}
do
    source file
done

Ich möchte ungefähr Folgendes tun:

for file in  ${(M)config_files}
do
    \time -f %E source file
done

Aber leider bekomme ich folgende Antwort:

time: cannot run source: No such file or directory

Was mache ich falsch?

Antwort1

sourceist ein eingebauter und kein externer Befehl, daher timeergibt die Verwendung des externen Befehls zum Timing keinen Sinn. Führen Sie einen der folgenden Schritte aus:

TIMEFMT=%E
for file in  ${(M)config_files}
do
    time (source file)
done

Oder:

for file in  ${(M)config_files}
do
    \time -f %E zsh -c 'source "$1"' zsh "$file"
done

In der ehemaligen,die Unterschale ist notwendig, weil:

Zusätzlicher Hinweis: Die eingebaute Zeit, die auf jede Konstruktion angewendet wird, die in der aktuellen Shell ausgeführt wird, wird stillschweigend ignoriert. Obwohl es syntaktisch in Ordnung ist, direkt nach dem Zeitschlüsselwort eine öffnende Schnörkelzeile oder eine Wiederholungsschleife oder Ähnliches einzufügen, erhalten Sie keine Zeitstatistiken. Sie müssen stattdessen Klammern verwenden, um eine Subshell zu erzwingen, die dann zeitlich festgelegt wird.

Und im letzteren Fall starten Sie für jede Datei eine neue ZSH-Instanz. In beiden Fällen gibt es also keine Möglichkeit, abhängige Skripte (d. h. wenn eine Konfigurationsdatei etwas tut, was von einer anderen Konfigurationsdatei verlangt wird oder sich irgendwie darauf auswirkt) einfach zeitlich zu steuern. Alternativ können Sie die Ausgabe timenach jeder Quelle speichern, wodurch Sie eine kumulative Zeitangabe erhalten:

TIMEFMT=%E
{time} 2> times
for file in  ${(M)config_files}
do
    source file
    {time} 2>> times
done

Anschließend können Sie mit awkoder etwas anderem die einzelnen Zeitangaben abrufen:

awk 'NR != 1 {print $0 - prev} {prev = $0; getline}' times

Antwort2

Ich sah mir den man timeBefehl an und stellte fest

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

also nehme ich an, dass Sie einen Pfad für die Zeit angeben sollten. Bitte beachten Sie, dass ich keine Erfahrung mit ZSH habe

verwandte Informationen