"History" funktioniert nicht mehr, wenn es im Bash-Skript ausgeführt wird

9

Ich schreibe ein einfaches Skript, um meine Bash-Historie zu durchsuchen und eine bestimmte Zeichenfolge zu finden. In der Befehlszeile kann ich Folgendes tun, was gut funktioniert:

history | grep git

Wenn ich jedoch ein Bash-Skript mit demselben Befehl wie oben erstelle, wird plötzlich historynichts zurückgegeben:

#!/bin/bash
history | grep git

Wenn ich die erste Zeile entferne #!/bin/bash, funktioniert mein Skript wieder. Was passiert hier? Wie kann ich historyin einem Bash-Skript verwenden?

Martin Vegter
quelle

Antworten:

8

Das Folgende ist für bash 4.0 or higher only, aber es macht den Trick. :) :)

#!/bin/bash -i
history | grep sometext

Funktioniert! Versuch es. ( -i= I nteractive, ein Flag nicht verfügbar bash 3.x und früher)

Syntax-Fehler
quelle
Danke auch an den Typen, der mich kürzlich herabgestimmt hat, nur weil er es kann. (Wahrscheinlich ein bashv3-Benutzer, nur aus Frustration, haha). Zumindest für Martin war meine Lösung eine große Hilfe, das ist (zumindest) ein Trost.
Syntaxfehler
Ich hatte die gleiche Frage, als ich ein Tool schrieb, das die Arbeit außerhalb der Bürozeiten für Support-Ingenieure rund um die Uhr protokolliert. Danke!
Henry van Megen
14

Wenn Sie ein Bash-Shell-Skript ausführen, z. B. indem Sie eine ausführbare Datei ausführen, deren Shebang-Zeile lautet #!/bin/bash, wird das Skript in einer nicht interaktiven Shell ausgeführt. Eine der Funktionen einer nicht interaktiven Shell ist, dass der Verlauf deaktiviert ist. Wenn Sie also möchten, dass Ihr Skript den Verlauf verwenden kann, müssen Sie Folgendes tun:

#!/bin/bash
HISTFILE=~/.bash_history   # Or wherever you bash history file lives
set -o history             # enable history
history | grep git

In diesem Fall hätten Sie natürlich einfach Folgendes tun können:

grep git ~/.bash_history

Da beide oben genannten Anforderungen erfordern, dass die Verlaufsdatei ( ~/.bash_history) auf dem neuesten Stand ist, wird dies mit ziemlicher Sicherheit nicht der Fall sein.

Ich bin nicht sicher, wie Sie Ihr Skript ausführen, nachdem die Shebang-Zeile entfernt wurde. Das Sourcing der Datei (z. B. mit .) ist nicht dasselbe wie das Ausführen des Skripts, da die Befehle in der aktuellen Shell ausgeführt werden, für die der Verlauf aktiviert ist.

Rici
quelle
Wie wäre es, wenn Sie history -adirekt nach dem Befehl set sicherstellen, dass die letzten Befehle zuerst an die Datei angehängt werden?
4
@ IlluminÉ: wird nicht helfen. Die Shell, mit der das Skript ausgeführt wird, ist ein völlig anderer Prozess. es beginnt mit einer frsh leeren Geschichte.
Rici