Aliase erweitern, bevor /usr/bin/time aufgerufen wird

Aliase erweitern, bevor /usr/bin/time aufgerufen wird

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/timediese 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, llbevor sie ihn an weitergibt /usr/bin/time? Das Parsen der Ausgabe von alias llist schwierig, insbesondere da die Definition des Alias ​​andere Aliase enthält.


Der Grund für die Verwendung /usr/bin/timeist die Messungmaximale Speicherauslastung.

Antwort1

Sie können einen Alias ​​für /usr/bin/timeFolgendes 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, lles handelt sich um einen Alias ​​für ls -l).

Da /usr/bin/timees 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/timeSie das Standardausgabeformat dem für die timeTastenkombinationen 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;1mfü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"

verwandte Informationen