Bash-Skript zum Löschen der letzten 10 Zeilen im Verlauf

Bash-Skript zum Löschen der letzten 10 Zeilen im Verlauf

ich möchte ein Bash-Skript erstellen, um die letzten 10 Zeilen im Verlauf zu löschen, das habe ich gemacht, aber ich erhalte immer noch eine Fehlermeldung

#!/bin/bash
i= history | wc -1
j= $i-10
for x in {$i..$j}
do
  history -d $x
done

Ich kann nicht herausfinden, was falsch ist. Irgendeine Idee?

Antwort1

Es liegen mehrere Fehler vor.

i= Verlauf | wc -1

Sie haben hier Leerzeichen, also müssten Sie dies in "" einschließen, um einen Fehler zu vermeiden, und zusätzlich haben Sie nach dem Gleichheitszeichen ein unnötiges Leerzeichen hinzugefügt. Sie haben jedoch nur eine Variable erstellt, die "history | wc -1" enthält. Erstens gibt es kein "wc -1". Ich glaube, Sie meinten "wc -l", das die Zeilen zählt. Zweitens glaube ich, dass Sie diesen Befehl tatsächlich ausführen wollten.

Du könntest benutzen:

i=$(Verlauf | wc -l)

Das Ergebnis wird jedoch immer 0 sein, da Sie sich in einer Untershell befinden.

j = $i-10

Sie haben nach dem Gleichheitszeichen ein Leerzeichen hinzugefügt. Sie könnten „j=$i-10“ verwenden, aber damit ist eigentlich nichts berechnet.

Versuchen Sie etwas wie:

j = $ (echo "${i}-10" | bc -l)

Sie möchten wahrscheinlich eine if-Anweisung schreiben, um Szenarien zu behandeln, in denen i 10 oder weniger ist.

Versuchen Sie etwas wie:

wenn [[ "$i" -lt "11" ]]; dann j="1"; fi
für x in {$i..$j}

Sie können hier keine Variablen verwenden. Das Ergebnis ist #..# statt einer Liste von Zahlen. Sie können dieses Problem umgehen, indem Sie eine einzeilige Anweisung für do done erstellen, die in eine Variable zurückgesendet wird, und dann eval verwenden, um sie tatsächlich auszuführen. Auf diese Weise werden $i und $j bereits durch die tatsächlichen Zahlen ersetzt, wenn der Befehl ausgeführt wird.

Letzten Endesobwohl,der gesamte Ansatz ist sinnlos, denn wenn Sie den Verlaufsbefehl im Shellskript ausführen, erhalten Sie als Ergebnis der Zählung Null, da Sie sich in einer Subshell befinden und Subshells ihren Verlauf nicht melden. Um zu sehen, was ich meine, führen Sie mehrere Befehle aus und führen Sie dann dieses Skript aus:

#!/bin/bash
Geschichte | WC -l

Wie Sie sehen, ist das Ergebnis 0. Warum? Weil es sich um den Verlauf der Subshell handelt und die Subshell den Verlauf nicht meldet. Selbst wenn Sie dem Skript vor dem Verlaufsbefehl andere Befehle hinzufügen, ist das Ergebnis 0.

Fangen Sie von vorne an. Versuchen Sie, die Verlaufsdatei direkt zu bearbeiten.wie @kos vorgeschlagen hat. Denken Sie daran, dass Befehle aus der aktuellen Shell erst in die Datei geschrieben werden, wenn die Shell beendet wird.

Viel Glück.

verwandte Informationen