Ein Befehl vor jedem Bash-Befehl

17

Kennt jemand ein Mittel, um vor jedem Befehl in einer Bash-Sitzung einen Zeitbefehl zu setzen?

jthoenes
quelle
1
Also ... Sie möchten jeder Kommandozeile automatisch 'Zeit' voranstellen?
Quack Quijote
1
ja, genau ... für die Leistung Mesuarament offensichtlich
jthoenes

Antworten:

37

Entschuldigen Sie die falsche Antwort, ich habe Ihre Frage missverstanden.

Um die Zeit vor jedem Befehl hinzuzufügen, den Sie auf der Shell ausführen, können Sie so etwas tun

bind 'RETURN: "\e[1~time \e[4~\n"'

Dadurch wird die Eingabetaste erneut gebunden. Jetzt wird jedes Mal, wenn Sie die Eingabetaste drücken, anstatt eine neue Zeile zu schreiben, an den Anfang der Zeile gesprungen. Geben Sie den Text 'time' und ein Leerzeichen ein, gehen Sie zum Ende der Zeile und geben Sie die neue Zeile ein, um die gewünschte Zeile zu erstellen bewirken.

Wenn Sie Ihre Eingabetaste nicht opfern möchten, können Sie eine zweite Benchmark-Eingabetaste wie F12 erstellen, indem Sie den Befehl wie folgt binden

bind '"\e[24~": "\e[1~time \e[4~\n"'

Anstatt jetzt die Eingabetaste zu ersetzen, haben Sie F12 gebunden.

Der Hintergrund all dessen ist, dass bash GNU readline verwendet, um Befehle zu lesen. Readline wäre also ein guter Ausgangspunkt für weitere Befehlsmanipulationen usw.

Lukas Loesche
quelle
1
+1 schöne Lösung! Ich mag die Idee, einen Benchmarking-Enter-Schlüssel getrennt vom regulären Enter-Schlüssel zu haben.
Quack Quijote
Das ist eine clevere Idee. Wie können Sie es verallgemeinern, um eine benutzerdefinierte Funktion vor jedem Befehl auszuführen? Ich weiß nicht, wie ich Bash-Code und eine Readline-Funktion in derselben Bindung kombinieren soll.
Gilles 'SO- hör auf böse zu sein'
Läuft das nicht auf einem Mac? Ich habe den Befehl im Terminal ausgeführt und meine Eingabetaste scheint jetzt nichts zu tun.
Akki
6

Mir ist klar, dass dies außerhalb des Rahmens dieser Frage liegt, aber ...

In zsh(was meines Wissens eine super Menge von Bash ist), wenn Sie die folgende Variable in Ihrer .zshrcDatei festlegen :

export REPORTTIME=5

Jeder Befehl, der länger als 5 Sekunden dauert (da bin ich mir ziemlich sicher), zeigt die Ausgabe von an time. Alle Befehle, die schneller ausgeführt werden, werden nicht ausgeführt. Und in solchen Fällen ist es einem eigentlich egal, also ist es schön, die Dinge nicht unübersichtlich zu machen. Es gibt auch viele andere coole Funktionen zsh, die Sie vielleicht genießen werden, wenn Sie gerade dabei sind.

tychoish
quelle
Netter Tipp. Während zsh mit Sicherheit eine Obermenge der Funktionalität von bash hat , ist seine Syntax keine Obermenge der Syntax von bash , so dass es sich nicht um einen "Drop-in" -Ersatz handelt.
Chris Johnsen
1

Fügen Sie \ t in Ihre Eingabeaufforderungszeichenfolge ein. Die Uhrzeit wird an der Stelle, an der Sie sie eingeben, in Ihre Eingabeaufforderung aufgenommen. Siehe: http://www.ibm.com/developerworks/linux/library/l-tip-prompt/

JRobert
quelle
Dies ist die aktuelle Zeit zum Zeitpunkt der Erstellung der Eingabeaufforderung und nicht die Zeit, die für die Ausführung des vorherigen Befehls benötigt wurde.
Bis auf weiteres angehalten.
Wahr; und der Unterschied zwischen dieser und der aktuellen Zeit der nächsten Eingabeaufforderung ist die Laufzeit (natürlich minus Schreibzeit - das Einfügen ist dein Freund hier). Keine Neuzuweisung von Schlüsseln erforderlich.
JRobert
0

PS1 scheint der Standard zu sein, um so etwas zu tun.

Jason Sundram
quelle
2
Es ändert die Anzeige, nicht den tatsächlich ausgeführten Befehl.
user1686
@grawity Richtig - aber es würde dir genau das bringen, was du willst ... die Zeit, die jeder Zeile vorangestellt wird.
Jason Sundram
3
Das ist völlig anders als das, was timetut (es misst, wie lange es gedauert hat, bis ein Befehl ausgeführt wurde).
user1686
@grawity, ich denke du hast recht - du müsstest die Subtraktion selbst machen. Sieht aus wie @Jrobert die gleiche Idee hatte.
Jason Sundram