Ich verwende einen einfachen Alias , um die "Verfolgung" von Befehlen in einem oder mehreren Terminalfenstern zu ermöglichen:
alias trackmi='export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"'
Dann habe ich nur tail -f
meine .bash_history- Datei in einem anderen Terminal im Arbeitsbereich, um sofortiges Feedback zu erhalten. Ich habe gerade den unbegrenzten Verlauf aktiviert und mein Verlaufsformat ( export HISTTIMEFORMAT="[%F %T] "
) in .bashrc aktualisiert . Natürlich history
zeigt der Befehl die Zeitstempel an. Das Format der Verlaufsdatei an sich ist jedoch:
#1401234303
alias
#1401234486
cat ../.bashrc
Wie kann ich die Unix-Zeit konvertieren und den gesamten Befehl in einer einzelnen Zeile anzeigen lassen, genau wie beim history
Befehl, einschließlich der Nummerierung:
578 [2014-05-27 19:45:03] alias
579 [2014-05-27 19:48:06] cat ../.bashrc
... und folge dem. Oder einen Weg finden, die Ausgabe des history
Befehls kontinuierlich an das Terminal auszugeben ?
quelle
fn+1
zum Vergleichen aktualisiere ! Vielen Dank!Hier ist das Endprodukt in Aktion auf einem Split-Screen-Xterm, von den Shell-Standardeinstellungen bis hin zur Arbeit mit nur wenigen Befehlen:
Ein rauerer Weg, dies zu tun, als im Screenshot gezeigt, könnte folgendermaßen aussehen:
Wo
${TGT_PTY}
wäre das, was Sie aus demtty
Befehl herausholen, wenn Sie tatsächlich eine interaktive Shell auf dem Bildschirm ausführen, auf dem Sie Ihre Ausgabe wünschen. Sie können auch jede beschreibbare Datei verwenden, da sie im Wesentlichen nur ein Ziel für die Umleitung von Dateien ist.Ich verwende die pty- Syntax für Pseudo-Terminals, weil ich davon ausgehe, dass es sich um ein xterm handelt, aber Sie können genauso gut ein vt zuweisen - und Ihr gestreamter Verlauf ist immer nur eine
CTRL-ALT-Fn
Tastenkombination entfernt. Wenn ich es wäre, könnte ich die beiden Begriffe kombinieren und es zu einerscreen
oder einertmux
Sitzung auf einem dedizierten vt machen ... Aber ich schweife ab.Auf einem frisch gebooteten Computer werde ich mit der typischen
/bin/login
Eingabeaufforderung auf einer typischen Linux-getty
Konsole begrüßt . Ich drücke,CTRL-ALT-F2
um auf eine weniger typischekmscon
Konsole zuzugreifen, die sich viel mehr wie einexterm
als eine verhälttty
. Ich gebe den Befehl eintty
und erhalte als Antwort/dev/pts/0
.Im Allgemeinen multiplexen xterms ein einzelnes Endgerät mithilfe von Pseudo-Terminals in mehrere. Wenn Sie also in X11 etwas Ähnliches tun, indem Sie zwischen Terminal-Registerkarten oder Fenstern wechseln, erhalten Sie wahrscheinlich auch eine Ausgabe wie diese
/dev/pts/[0-9]*
. Die virtuellen Terminalkonsolen, auf die mitCTRL-ALT-Fn
Tastenkombinationen zugegriffen wird, sind jedoch echte (er) Endgeräte und erhalten daher ihre eigene/dev/tty[0-9]*
Bezeichnung.Dies ist der Grund, warum nach der Anmeldung bei Konsole 2, wenn ich
tty
an der Eingabeaufforderung tippe, die Antwort lautet,/dev/pts/0
aber wenn ich dasselbe auf Konsole 1 mache, ist die Ausgabe/dev/tty1
. Auf jeden Fall mache ich dann wieder auf Konsole 2:Es ist kein Effekt erkennbar. Ich tippe noch ein paar Befehle ein und wechsle dann durch erneutes Drücken zu Konsole 1
CTRL-ALT-F1
. Und dort finde ich wiederholte Einträge, die<date_time>\n<hist#>\t<hist_cmd_string>
für jeden Befehl aussehen, den ich auf Konsole 2 eingegeben habe.Wenn Sie nicht direkt auf ein Endgerät schreiben, könnte eine andere Option folgendermaßen aussehen:
Und dann vielleicht ...
Der grobe Eingabeaufforderungsbefehl entspricht nicht Ihren Spezifikationen - keine Formatzeichenfolge für
date
und auch keine Formatierungsoptionenfc
-, aber sein Mechanismus erfordert nicht viel: Jedes Mal, wenn Ihre Eingabeaufforderung den letzten Verlaufsbefehl ausgibt und das aktuelle Datum und die aktuelle Uhrzeit ausgeschrieben werden die von${TGT_PTY}
Ihnen angegebene Datei. So einfach ist das.Das Beobachten und Drucken des Shell-Verlaufs ist
fc
der Hauptzweck. Es ist eine eingebaute Shell, auch wenn diesdate
nicht der Fall ist. Inzsh
fc
kann alle Arten von ausgefallenen Formatierungsoptionen bereitstellen, von denen einige für Zeitstempel gelten. Und natürlich, wie Sie oben beachten,bash
‚shistory
kann das gleiche tun.Im Interesse einer saubereren Ausgabe können Sie eine hier besser erläuterte Technik verwenden , um eine persistente Verfolgungsvariable in der aktuellen Shell festzulegen, obwohl Sie sie verfolgen und in Unterschalen innerhalb der Eingabeaufforderungssequenz verarbeiten müssen.
Hier ist ein tragbares Mittel zum Formatieren nach Ihren Vorgaben:
Ich implementiere den Zähler last_history
$_LH
, der nur die neuesten Aktualisierungen verfolgt, damit Sie nicht zweimal denselben Verlaufsbefehl ausschreiben - zum Beispiel nur, indem Sie die Eingabetaste drücken. Es ist ein wenig Streit erforderlich, um die Variable in der aktuellen Shell zu erhöhen, damit sie ihren Wert behält, obwohl die Funktion in einer Subshell aufgerufen wird - was wiederum im Link besser erklärt wird .Die Ausgabe sieht aus wie
<hist#>\t[%F %T]\t<hist_cmd>\n
Aber das ist nur die voll portable Version. Mit
bash
nur Schal builtins mit weniger und durch die Implementierung durchgeführt werden kann - und das ist wahrscheinlich wünschenswert , wenn man bedenkt , dass dies ein Befehl ist , dass jedes Mal , wenn Sie laufen drücken[ENTER]
. Hier sind zwei Möglichkeiten:Alternativ können Sie mit
bash
demhistory
Befehl 's die_HIST
Funktion folgendermaßen definieren :Die Ausgabe für beide Methoden sieht ebenfalls so aus:
<hist#>\t[%F %T]\t<hist_cmd>\n
Diehistory
Methode enthält jedoch einige führende Leerzeichen. Trotzdem glaube ich, dass diehistory
Zeitstempel der Methode genauer sind, da ich nicht glaube, dass sie warten müssen, bis der Befehl, auf den verwiesen wird, abgeschlossen ist, bevor sie ihren Stempel erhalten.Sie können in beiden Fällen vermeiden, einen Status zu verfolgen, wenn Sie den Stream nur irgendwie filtern
uniq
- wie Sie es vielleicht tun,mkfifo
wie ich bereits erwähnt habe.Wenn Sie dies jedoch in der Eingabeaufforderung wie dieser tun, wird es immer nur so schnell wie nötig aktualisiert, indem Sie lediglich die Eingabeaufforderung aktualisieren. Es ist einfach.
Sie können auch etwas Ähnliches tun, wie Sie es tun,
tail
aber lieber festlegenquelle
${TGT_PTY}
und alles? Wenn ja, würde dies die "mehrdeutige Umleitung" erklären, da dies eine leere Variable wäre. Sie benötigen eine Datei./dev/pts/[num]
aller Wahrscheinlichkeit nach -cat
ich war paranoid. Es funktioniert gut - sogar 12 Stunden später.Fühlen Sie sich frei, mit der Formatierung zu spielen, aber dies (glaube ich) macht das, wonach Sie fragen ... Speichern Sie es irgendwo in Ihrem Pfad, machen Sie es ausführbar und genießen Sie:
Ich bin sicher, dass es optimiert werden kann, aber Sie bekommen die Idee.
Kurze Erklärung: Da die ~ / .bash_history die Anzahl nicht verfolgt, bestimmen wir zuerst die Anzahl der Einträge. Dann ein bisschen Magie, um die Formatierung richtig zu machen und die Anzahl der Einträge zu verfolgen.
quelle
tail -f
auch zunächst 10 Zeilen, die bereits in Ihrem enthalten sindcount
. Es wird das GNU-Datum in einer Nicht-POSIX-Umgebung angenommen (POSIXLY_CORRECT nicht festgelegt). Pro Zeitstempel werden eine Shell und ein Datumsbefehl ausgeführt.count
zählt die halbe Zeile in.bash_history
und erhöht sich dann für jede Zeile, die nicht mit beginnt#
, sodass die gemeldete Verlaufszahl wahrscheinlich falsch ist. Die Verwendungcount=$(grep -c '^#' ...)
wäre wahrscheinlich besser, aber in jedem Fall sind diese Verlaufsnummern wahrscheinlich nicht synchron, insbesondere wenn mehr als 2 Bash gleichzeitig ausgeführt werden.history
Befehl nutzt.