Wenn ich die integrierte Shell verwende time
, kann ich jeden Befehl übergeben, den ich auch ohne an die Shell übergeben würde time
. Aber wenn ich die externe verwende /usr/bin/time
, kann ich keinen Shell-Alias übergeben, weil /usr/bin/time
diese natürlich nicht bekannt sind:
$ /usr/bin/time ll
/usr/bin/time: cannot run ll: No such file or directory
Wie kann ich die Shell dazu bringen, den Alias für zu erweitern, ll
bevor sie ihn an weitergibt /usr/bin/time
? Das Parsen der Ausgabe von alias ll
ist schwierig, insbesondere da die Definition des Alias andere Aliase enthält.
Der Grund für die Verwendung /usr/bin/time
ist die Messungmaximale Speicherauslastung.
Antwort1
Sie können einen Alias für /usr/bin/time
Folgendes definieren:
alias 'ubtime=/usr/bin/time '
Oder
alias 'ubtime=command time '
wenn Sie den Pfad zur ausführbaren Datei nicht fest codieren möchten time
.
Der Trick liegt im abschließenden Leerzeichen in der Aliasdefinition, das der Shell mitteilt, dass Aliase nach diesem Alias ersetzt werden müssen, damit
ubtime ll
Wird tatsächlich erweitert auf
/usr/bin/time ls -l
(vorausgesetzt, ll
es handelt sich um einen Alias für ls -l
).
Da /usr/bin/time
es sich um eine eigenständige ausführbare Datei handelt, kann es keine Pipelines, zusammengesetzten Befehle, Funktionen oder integrierten Shell-Funktionen zeitlich steuern und kann daher auch nicht die Erweiterung beliebiger Aliase zeitlich steuern.
Wenn /usr/bin/time
Sie das Standardausgabeformat dem für die time
Tastenkombinationen vorziehen, beachten Sie, dass das Format in vielen Shells geändert werden kann. Zum Beispiel in zsh
:
$ TIMEFMT=$'\e[31;1m%J\e[m: U:%U S:%S (%*E total) [avgtext:%X avgdata:%D maxmem:%M]'
$ time ls -l | head -n1
total 288072444
ls -l: U:0.00s S:0.01s (0.017 total) [avgtext:0 avgdata:0 maxmem:3]
head -n1: U:0.00s S:0.00s (0.015 total) [avgtext:0 avgdata:0 maxmem:3]
( \e[31;1m
für die farbige (fettrote) Ausgabe).
Antwort2
Dies könnte in Bash funktionieren:
/usr/bin/time $(alias "ll" | sed "s/^alias [^=]*='\(.*\)'/\1/")
aber noch nicht vollständig sicher für beliebige Aliase, hinsichtlich Leerzeichen, Escape-Zeichen, verschachtelter Aliase und Funktionen usw.
Ich denke, es ist keine Lösung möglich, die nicht hässlich ist. Deshalb haben Shells eine integrierte Funktion time
. Selbst wenn die Aliaserweiterung einfacher wäre, wäre das nächste Problem, wie man Funktionen zeitlich festlegt. Beachten Sie, dass Aliase sogar Shell-Funktionen verwenden können.
Wenn Ihre Aliase in den Konfigurationsdateien von Bash definiert sind und Sie sich nicht um den zeitlichen Mehraufwand kümmern, können Sie Folgendes versuchen:
/usr/bin/time bash -l -i -c "ll"