Einfachste Standardmethode zum Drucken des letzten Bash-Befehls mit Zeitstempel

8

Ich möchte den letzten Bash-Befehl mit seinem Zeitstempel drucken. history 1zeigt den Verlaufsbefehl selbst. Ich muss es auf vielen Computern verwenden, daher sollte es nicht von einer benutzerdefinierten Konfiguration abhängen. Es muss sicherlich einen einfachen Befehl geben, den ich vermisse, um dies zu tun, wie lastcmdoder so :)

Beachten Sie, dass fc -l -1der letzte Befehl ohne Zeitstempel angezeigt wird und zu kompliziert ist, um ihn ohnehin häufig einzugeben.

Zur Verdeutlichung suche ich nach einer standardmäßigen und einfachen Möglichkeit, dies zu tun, da ich sie auf vielen Servern verwenden muss und es nicht möglich ist, sie alle anzupassen oder benutzerdefinierte Funktionen zu erstellen. Außerdem muss ich diesen Befehl manuell eingeben, damit er wirklich einfach ist.

Es scheint, dass HISTCONTROL = ignoreboth eine Standardeinstellung auf Servern ist, auf die ich zugreifen muss, damit ich Folgendes verwenden kann:

 history 1 

(Befehl history mit vorangestelltem Leerzeichen), der nicht in den Verlauf eingefügt wird, sodass der letzte Befehl korrekt angezeigt wird.

HISTTIMEFORMATist jedoch nicht standardmäßig festgelegt, daher handelt es sich nicht um eine vollständige Lösung. Gibt es einen einfacheren Weg?

mmm
quelle
2
Meinen Sie den Zeitstempel, zu dem der letzte Befehl ausgeführt wurde ? Das wird von Bash nicht gespeichert. Es wird jedoch von der Fischschale gespeichert.
Andrea Lazzarotto
Ja, auch nur ein Zeitstempel würde für meinen Anwendungsfall ausreichen
mmm
Könnten Sie bitte angeben, wie dieser Zeitstempel in Fish angezeigt werden soll?
mmm
Ich kenne keinen einfachen Weg, dies in Fish zu tun. Ich habe gerade geschrieben, dass es diese Informationen speichert. Hier finden Sie jedoch ein Skript und eine Funktionsanforderung: github.com/fish-shell/fish-shell/issues/677
Andrea Lazzarotto

Antworten:

9

Wie Sie hervorheben, wird history 1der historyBefehl selbst gedruckt, da dies der letzte Befehl ist, den Sie ausgeführt haben. Um die vorherige zu erhalten, benötigen Sie history 2:

$ touch foo
$ history 2
$ history 2
19950  touch foo
19951  history 2

Um den vorherigen Befehl zu erhalten, ohne sich historyselbst zu zählen , führen Sie ihn durch head -n1:

$ history 2 | head -n1
19952  touch foo

Fügen Sie dann den Zeitstempel in einem beliebigen Format hinzu (siehe man 3 strftimeverfügbare Formate):

$ HISTTIMEFORMAT="%F %H:%m:%S " history 2 | head -n1
19959  2016-06-11 15:06:08 touch foo
terdon
quelle
danke das funktioniert, aber ich hoffe immer noch, dass es etwas einfacheres gibt :)
mmm
@mmm es wird nicht viel einfacher als history 2 | head -n1. Sie können die HISTTIMEFORMATVariable jederzeit in .profileoder festlegen .bashrc, um sie nicht im Befehl festzulegen. Noch einfacher, machen Sie das Ganze einfach zu einem Alias.
Terdon
Ich denke, das funktioniert nur, wenn die Shell aktiv ist, oder? Gibt es eine Möglichkeit, Bash so zu konfigurieren, dass die Zeitstempel mit dem Verlauf gespeichert werden?
Andrea Lazzarotto
@AndreaLazzarotto tut es bereits, deshalb kann es sie drucken, wenn es dazu aufgefordert wird. ~/.bash_history
Werfen
2
@AndreaLazzarotto Entschuldigung, es wird nur geschrieben, ~/.bash_historywenn die HISTTIMEFORMATVariable gesetzt ist. Versuchen Sie es export HISTTIMEFORMAT="%F %H:%m:%S"; history -a; tail .bash_historyzum Beispiel. Eine HISTTIMEFORMATglobale Einstellung (z. B. in ~/.profile) sollte also ausreichen, damit dies automatisch erfolgt.
Terdon
0

Eine nicht-historische Option, die helfen kann, besteht auch darin, Ihre Shell so anzupassen, dass sie angezeigt wird. Ich habe es zeigen und andere Infos (sogar Git Branch!) Mit:

HOST='\[\033[02;36m\]\h'; HOST=' '$HOST
TIME='\[\033[01;31m\]\t \[\033[01;32m\]'
LOCATION=' \[\033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \[\033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH

Es hilft meiner Geschichte an sich nicht, aber wenn ich in meinem Terminal zurück scrolle, kann ich zumindest sehen:

$ vi .bashrc
17:57:09 durrantm Castle2012 /home/durrantm 
$ pwd
/home/durrantm
17:57:10 durrantm Castle2012 /home/durrantm 
$ ls *.lt*
ls: cannot access *.lt*: No such file or directory
17:57:15 durrantm Castle2012 /home/durrantm 
$ ls *.rb*
1.rb  2.rb  3.rb  3_step_minimal_foundation_spec.rb  arrival.rb  r.rb  validate_controller.rb  x.rb*
17:57:19 durrantm Castle2012 /home/durrantm 
$ c
17:57:24 durrantm Castle2012 /home/durrantm/Dropbox/_/work/code 
$ which ruby
/home/durrantm/.rvm/rubies/ruby-2.1.2/bin/ruby
17:57:27 durrantm Castle2012 /home/durrantm/Dropbox/_/work/code 
Michael Durrant
quelle
0

Es scheint, dass Bash keine einfache Möglichkeit bietet, einen Zeitstempel zu erhalten, wenn der letzte Befehl ausgeführt wurde.

Falls es für Sie praktisch ist, die Bash-Konfigurationen Ihres Servers anzupassen, können Sie eine benutzerdefinierte Bash-Funktion basierend auf der Antwort von @terdon erstellen.

mmm
quelle
0

Ausführen

export HISTTIMEFORMAT='%F %T '

und Ihre Verlaufsdatei zeichnet Zeiten auf (nur für neue Befehle):

$ history 5

99576  2016-06-13 02:26:25 export HISTTIMEFORMAT='%F %T '
99580  2016-06-13 02:26:45 bash -c 'IFS=:$IFS ; set -- a b c ; echo "$@ "'
99581  2016-06-13 02:27:37 dash -c 'set a b c; IFS=; echo $*'
99582  2016-06-13 02:28:25 fc -l -1
99607  2016-06-13 02:28:25 history 5

UND

Verwenden Sie ein Leerzeichen vor dem Befehl, um zu vermeiden, dass es im Verlauf aufgezeichnet wird:

$  history 1
99607  2016-06-13 02:28:25 history 5

Erstellen Sie zur Vereinfachung einen Alias:

$ alias h='history 1'

Verwenden Sie es dann mit einem Leerzeichen, nachdem das HISTTIMEFORMATfestgelegt wurde, um Folgendes zu erhalten:

$  h                ### Understand that there is an space in front of the command.
99607  2016-06-13 02:28:25 history 5

quelle