
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 .zshrc
so 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
source
ist ein eingebauter und kein externer Befehl, daher time
ergibt 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 time
nach 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 awk
oder etwas anderem die einzelnen Zeitangaben abrufen:
awk 'NR != 1 {print $0 - prev} {prev = $0; getline}' times
Antwort2
Ich sah mir den man time
Befehl 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