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 history
nichts 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 history
in einem Bash-Skript verwenden?
bash
shell-script
command-history
Martin Vegter
quelle
quelle
bash
v3-Benutzer, nur aus Frustration, haha). Zumindest für Martin war meine Lösung eine große Hilfe, das ist (zumindest) ein Trost.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:In diesem Fall hätten Sie natürlich einfach Folgendes tun können:
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.quelle
history -a
direkt nach dem Befehl set sicherstellen, dass die letzten Befehle zuerst an die Datei angehängt werden?