Bash deaktiviert den Verlauf in nicht interaktiven Shells standardmäßig, aber Sie können ihn aktivieren.
#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | tail …
Wenn Sie jedoch versuchen, die Aktivität auf diesem Server zu überwachen, ist der Shell-Verlauf unbrauchbar (es ist trivial, Befehle auszuführen, die nicht im Verlauf angezeigt werden). Siehe Wie kann ich alle Prozesseinführungen in Linux einloggen .
Wenn Sie ein Skript debuggen, ist der Shell-Verlauf nicht der beste Weg, um nützliche Informationen zu erhalten. Ein viel besseres Tool ist die Debug-Trace-Funktion: Sie wird ganz set -x
oben im Skript platziert. Der Trace wird auf Standardfehler geschrieben.
Gilles 'SO - hör auf böse zu sein'
quelle
histtest.sh: 5: set: Illegal option -o history
sh
ist ein Strich, der sich nach dem genauen Wortlaut der Fehlermeldung richtet). Um auf den Bash-Verlauf zuzugreifen, müssen Sie Bash verwenden (Skript beginnt mit#!/bin/bash
oder#!/usr/bin/env bash
).Illegal option
(es würde sagenset: history: invalid option name
).set -o history
, der dann mit einträgen wieif [...
vars=$(...
etc. vollgestopft wirdset -x
ist dies viel nützlicher.Ich bin nicht sicher, ob es tatsächlich die Verlaufsfunktion verwendet, wenn es nicht interaktiv ausgeführt wird. Andernfalls würde jedes Shell-Skript, das Sie ausführen, Ihren Befehlsverlauf überladen.
Warum nicht direkt an die Quelle gehen
${HOME}/.bash_history
, ersetzenhistory | tail -100
mittail -100 ${HOME}/.bash_history
. (Wenn Sie Zeitstempel verwenden, müssten Sie wahrscheinlich etwas in der Art von tungrep -v ^# ${HOME}/.bash_history | tail -100
).quelle
greq -v '^#[0-9]\+$'
(ich "history
grep
history -a; history -c; history -r
. (hinzufügen, löschen, lesen)Wenn Sie die Ausgabe des
history
Befehls aus einer aktiven Shell-Sitzung in einem Skript verwenden möchten , können Sie den Befehl zuerst mit einem Alias ausführen. Anschließend können Sie im gleichen Alias den Rest des Skripts aufrufen. Mit einer solchen Konfiguration erzielen Sie im Wesentlichen das gleiche Ergebnis wie mit demhistory
Befehl im eigentlichen Skript.Sie können beispielsweise einen Alias wie diesen erstellen, vorausgesetzt, der Name des Skripts lautet script.sh:
Und ändern Sie das Skript folgendermaßen:
Ich habe diese Frage gefunden, als ich einen Prozess zum Kombinieren, Sortieren und Synchronisieren von
~/bash_history
Dateien auf zwei Computern geschrieben habe, damit die Suche nach Befehlen, die ich in der Vergangenheit verwendet habe, einfacher wird.Es ist viel einfacher, meine kumulative Verlaufsdatei zu aktualisieren, ohne sich bei einer neuen Shell anmelden zu müssen, um
~/bash_history
aktualisiert zu werden. Für die Überwachung eines Servers funktioniert dies natürlich nicht, wie in den anderen Antworten erwähnt.Meine Verwendung ist insbesondere:
Das Skript
hby.sh
zieht dann alle eindeutigen Einträge aus allen~/.bash_history*
Dateien.quelle
Der eingebaute Verlauf scheint in einem Shell-Skript deaktiviert zu sein. Siehe hier: http://www.tldp.org/LDP/abs/html/histcommands.html
Ich habe keine offizielle Dokumentation dazu gefunden.
quelle
Erstellen Sie ein Skript mit dem folgenden Namen
script.sh
. Es erstellt ein Skript mit dem Namen X und fügt Y Anzahl der Zeilen Ihres Verlaufs ein.Wenn Sie dann ein Skript erstellen möchten, um eine Aufgabe mit dem Namen "task" auszuführen, an der Sie in den letzten 14 Zeilen gearbeitet haben, werden Sie ausgeführt
Bereinigen Sie dann Ihren Verlauf, um ein schönes Skript zu erstellen!
quelle
histtest.sh: 5: set: Illegal option -o history
Der Befehl history ist in Bash-Skripten standardmäßig deaktiviert, daher funktioniert auch der Befehl history in der SH-Datei nicht. Leiten Sie für die Umleitung die Datei bash_history in die Datei .sh um.
Der Verlaufsmechanismus kann auch durch Erwähnen der Verlaufsdatei und Ändern der Laufzeitparameter aktiviert werden, wie unten angegeben
Hinweis: Oben zwei Zeilen oben in der Skriptdatei erwähnt. Jetzt funktioniert der Befehl history in history.
quelle
Jeder Benutzer hat eine eigene Verlaufsdatei, die aus dem Verlaufsbefehl resultiert. Anstatt den Verlaufsbefehl in Ihrem Shell-Skript zu verwenden, können Sie die Verlaufsdatei für den Benutzer verwenden.
.bash_history
Im Ausgangsverzeichnis des Benutzers befindet sich eine Datei, die die Verlaufsdatei für den Benutzer darstellt.quelle
Kurze Antwort :
Verwenden Sie
history -p
diese Option, um die Verlaufserweiterung explizit durchzuführen.Ein Beispiel folgt.
Ein Anwendungsfall, der mir häufig passiert, ist:
Seit meiner Prügelei habe
set -o histexpand
ich in der Regel nur noch getipptum die vom vorherigen Befehl aufgelisteten Dateien zu bearbeiten.
Leider passiert manchmal ein Fehler, sodass ich die Überprüfung durch aktiviere
shopt -s histverify
.Jetzt kann ich die Erweiterung mit einem zusätzlichen ReturnSchlüssel überprüfen .
Heute möchte ich diese Details in eine Bash-Funktion packen, da ich sie oft benutze.
Hier verwende ich zwei verschachtelte Befehle
command substitution
, den inneren, um!!
zum vorherigen Befehl zu gelangen, den äußeren, um ihn auszuführen und die Ausgabe zu erhalten.Jetzt kann ich mit nur drei Tasten den gleichen Effekt erzielen, und eine davon ist Return!
quelle