2014-04-06 14 views
5

Ich versuche, die Historie in tcsh nach jedem eingegebenen Befehl zu speichern, anstatt sie direkt nach dem Befehl "exit" zu speichern. Das liegt daran, dass ich normalerweise ungefähr 10 Tabs gleichzeitig öffne und danach schließe ich einfach das Terminalfenster, anstatt "Exit" in jedes Tab zu tippen. Das Ergebnis ist, dass der Verlauf nur für die letzte Registerkarte gespeichert wird. Diese Lösung funktioniert nicht, wenn ich das Terminalfenster schließe: https://stackoverflow.com/a/3577709/2773143.tcsh - Geschichte direkt nach dem Befehl speichern

Da ich keine Lösung gefunden habe, nur mit History-Befehlen, habe ich versucht, es auf andere Weise zu lösen: echo jeden Befehl auf ~/.tcsh_history direkt und Einstellung set histfile= ~/.tcsh_history in der Datei .tcshrc. Allerdings habe ich auch keinen Weg gefunden, dies zu tun. Ich dachte über einen Alias ​​in .alias an alle Befehle, etwas wie (mit vielen anderen Versionen), aber es hat nicht funktioniert. Ich habe herausgefunden, wie man das funktioniert, indem man jedem Befehl einen anderen Alias ​​gibt, aber es ist etwas hässlich.
zum Beispiel:
alias cd 'cd \!*; ~/saveHist.tcsh \!:0 \!*'
alias grep 'grep \!*; ~/saveHist.tcsh \!:0 \!*'
(etc)
und in der ~/saveHist.tcsh Datei:

#!/bin/tcsh -f 

echo "$argv" >> ~/.tcsh_history 

aber natürlich diese etwas hässlich ist und auf diese Weise werden einige Befehle geschrieben werden zweimal in der ~/.tcsh_history nach dem Schließen des Fensters.

Irgendwelche Ideen?

Antwort

1

Wenn Sie die Shellvariable savehist wie unten gezeigt setzen, wird der Verlauf jedes Mal, wenn Sie ihn speichern, in den vorhandenen Verlauf übernommen. Unten von der Manpage für die Verwendung von history -S:

Mit -S speichert das zweite Formular die Verlaufsliste in Dateiname. Wenn das erste Wort der savehist-Shell-Variablen auf eine Zahl gesetzt ist, werden höchstens so viele Zeilen gespeichert. Wenn das zweite Wort von savehist auf "Zusammenführen" gesetzt ist, wird die Verlaufsliste mit der vorhandenen Verlaufsdatei zusammengeführt, anstatt sie zu ersetzen (falls vorhanden) und nach Zeitstempel sortiert. (+) Zusammenführen ist für eine Umgebung wie das X Window System gedacht, bei der mehrere Shells gleichzeitig verwendet werden. Wenn das zweite Wort von savehist "merge" ist und das dritte Wort auf "lock" gesetzt ist, wird das Update der History-Datei mit anderen Shell-Sessions serialisiert, die möglicherweise den Verlauf zur gleichen Zeit zusammenführen möchten.

2

Um nach jedem eingegebenen Shell-Befehl automatisch einen Befehl auszuführen, setzen Sie den Befehl auf den Alias ​​postcmd. Zum Beispiel:

alias postcmd 'date' 

... bewirkt, dass der „date“ Befehl direkt nach dem Sie einen Befehl eingeben laufen (obwohl es eigentlich vor den Befehl ausführt Sie eingegeben haben, soweit ich das beurteilen kann).

Und wie Mark Armstrong in seiner Antwort anspielt, speichert history -S die aktuelle Geschichte. Also, theoretisch könnten Sie

alias postcmd 'history -S' 

... in Ihrem .tcshrc setzen, und Ihre History-Datei wird jedes Mal, wenn Sie einen Befehl eingeben gespeichert werden - so dass keine Notwendigkeit erstellen Aliase für jeden Befehl, den Sie möglicherweise verwenden könnten, oder Verwenden Sie ein benutzerdefiniertes Skript, um manuell in Ihre Verlaufsdatei zu schreiben.

Ich sage, das funktioniert theoretisch, weil, wenn ich es versuche (wie ich auch leiden von meiner Geschichte weggeblasen werde, wenn ichvergesse, bevor ich ein Terminalfenster schließe ...), wird die .history-Datei nur mit dem Verlauf des geschrieben aktuelle Shell, auch wenn merge in der savehist Variable angegeben ist - sehr frustrierend. Aber vielleicht verhält sich Ihr System anders (ich bin auf OS X), also versuchen Sie es vielleicht.

+0

Hmm. Es scheint, dass Sie etwas wie ein 'history -M 'in einer Art Pre-Command-Alias ​​benötigen würden. (ungetestet) –

+0

'alias precmd 'history -M' scheint zu funktionieren, aber es spielt Chaos mit den Befehlsverlaufszahlen. –

Verwandte Themen