Wie kann ich meinen Bash-Verlauf über mehrere Sitzungen hinweg aufbewahren?

27

Ich arbeite an einem x86-Ziel mit Fedora 9.

Immer wenn ich es neu starte, kehrt mein Verlauf in einen bestimmten Zustand zurück und ich habe keine Befehle, die ich in den Sitzungen vor dem Neustart ausgeführt habe.

Was muss ich ändern, um den Verlauf zu aktualisieren, den ich vor dem Neustart hatte?

BЈовић
quelle
Er fragt: "Wie behalte ich meinen Bash-Verlauf über Sitzungen hinweg?", Was mit der Shell-Programmierung zusammenhängt. Der Neustart ist eine dramatische Möglichkeit, Ihre Shell zu verlieren, das ist alles. Das Thema muss nicht abgeschlossen werden.
Jonathan Leffler
Guter Punkt - dies sollte wahrscheinlich zu SuperUser verschoben werden.
BR
@ Jonathan Ja, du hast die Frage richtig gestellt. Ich war mir nicht sicher, was ich genau fragen sollte.
Das Speichern jedes Befehls direkt nach seiner Ausführung, nicht am Ende der Sitzung, hilft ebenfalls. Wenn Sie zwei Sitzungen gleichzeitig ausführen, speichert bash ohne die folgende Zeile den Verlauf von Sitzung-1 (etwa), wenn sie geschlossen wird. Wenn Sitzung-1 ausgeführt wird und Sie sofort auf den Verlauf von Sitzung-1 in Sitzung-2 zugreifen möchten, ist dies nur möglich, wenn Sie die folgende Zeile zur .bashrc-Datei hinzufügen. PROMPT_COMMAND = 'history -a'
Abhinav

Antworten:

16

Welche Geschichte? Bash-Geschichte? Wenn Sie den Bash-Verlauf verlieren und mehrere Sitzungen gleichzeitig haben, wird in jeder Sitzung der Verlauf der anderen Sitzungen überschrieben.

Sie möchten Bash wahrscheinlich anweisen, den Verlauf nicht jedes Mal zu überschreiben, sondern ihn anzufügen. Sie können dies tun, indem Sie die .bashrc-Datei so ändern, dass sie ausgeführt wird shopt -s histappend.

Sie können die Größe Ihrer Verlaufsdatei auch erhöhen, indem Sie HISTSIZE als große Zahl exportieren (in Byte, also sollten 100000 ausreichend sein).

BR
quelle
7
HISTSIZEist die Anzahl der zu merkenden Befehle, nicht die Anzahl der Bytes.
Chris Down
10

Ich wurde aus dem gleichen Problem leiden - aber meine .bashrcDatei hatte bereits die shopt -s histappendund richtig HISTFILE, HISTSIZE, HISTFILESIZE.

Für mich bestand das Problem darin, dass sich meine .bash_historyDatei im Besitz von root und nicht meines Benutzernamens befand, sodass mein Benutzer beim Beenden niemals in dieser Datei speichern konnte.

icc97
quelle
3
Ich habe gerade festgestellt, dass ich genau das gleiche Problem mit .bash_history von root hatte. Ich wünschte, ich hätte es bemerkt, bevor ich all meine schöne Geschichte verloren hätte, aber vergiss es :-)
SamStephens
das gleiche hier - endete mehrere Tage wandern :) danke!
Davka
1
sudo chmod your_user_name .bash_historygeschafft! Vielen Dank.
Wij
sudo chown user_name:user_name ~.bash_historyIch habe es gelöst!
alper
3

Suchen Sie die Umgebungsvariablen HISTFILE, HISTSIZE, HISTFILESIZE.

Jonathan Leffler
quelle
2

Ich habe ein Skript zum Festlegen einer Verlaufsdatei pro Sitzung oder Aufgabe auf der Grundlage der folgenden Informationen geschrieben.

    # write existing history to the old file
    history -a

    # set new historyfile
    export HISTFILE="$1"
    export HISET=$1

    # touch the new file to make sure it exists
    touch $HISTFILE
    # load new history file
    history -r $HISTFILE

Es ist nicht notwendig, jeden Verlaufsbefehl zu speichern, aber es speichert die, die mir wichtig sind, und es ist einfacher, sie abzurufen, als jeden Befehl zu durchlaufen. Meine Version listet auch alle Verlaufsdateien auf und bietet die Möglichkeit, sie alle zu durchsuchen.

Vollständige Quelle: https://github.com/simotek/scripts-config/blob/master/hiset.sh

simotek
quelle
1

Ich habe einige Zeilen in meine .bashrc geschrieben, die Folgendes bewirken: Speichern Sie jede Sitzung nach jedem Befehl in einer Datei. Es werden so viele Verlaufsdateien vorhanden sein, wie Sie jemals mit Terminals begonnen haben. Beim Starten eines neuen Terminals ab der letzten Protokolldatei werden alle Protokolldateien aus früheren Sitzungen in den Protokollpuffer geladen, bis ein Zeilenzählungsschwellenwert erreicht ist.

HISTCONTROL=''
HISTFOLDER=~/.bash_histories
HISTFILEEXT=history      # only files in $HISTFOLDER with this extension will be read
shopt -s histappend   # append when closing session
mkdir -p $HISTFOLDER
HISTFILE=$HISTFOLDER/$(date +%Y-%m-%d_%H-%M-%S_%N).$HISTFILEEXT  # create unique file name for this session. Nanoseconds seems to be unique enough, try: for ((i=0; i<=10; i++)); do date +%Y-%m-%d_%H-%M-%S_%N; done
# if HISTFILE unset, history is not saved on exit -> not really necessary if we save after each command, but its a double net safety
HISTSIZE=-1       # maximum number of commands to hold inside bash history buffer
HISTFILESIZE=-1   # maximum number of lines in history file
# history -a $HISTFILE # bash saves the total history commands entered since startup or since the last save and saves that amount of commands to the file. This means reading a history file after typing commands will trip up bash, but this won't be a problem if the history file is only loaded in the beginning. This means that only new commands are saved not all the old loaded commands, thereby we can load as many history files into the buffer as we want and still only save newly thereafter typed commands
PROMPT_COMMAND="history -a $HISTFILE; $PROMPT_COMMAND"  # This command is executed after very typed command -> save history after each command instead after only closing the session

# Load old histories from last 5 files/sessions
HISTLINESTOLOAD=2000
# --reverse lists newest files at first
names=($(ls --reverse $HISTFOLDER/*.$HISTFILEEXT 2>/dev/null))
toload=()
linecount=0
# Check if is really file and count lines and only append to $toload if linecount under $HISTLINESTOLOAD
for fname in ${names[*]}; do
    if test -f $fname; then
        linecount=$((linecount+$(wc -l < $fname) ))
        if test $linecount -ge $HISTLINESTOLOAD; then
            break
        fi
        toload+=($fname)
    fi
done
# Beginning with the oldest load files in $toload into bash history buffer
for (( i=${#toload[*]}-1; i>=0; i-- )); do
    history -r ${toload[$i]}
done
mxmlnkn
quelle
0

Ich würde sicherstellen, dass .bash_history existiert. Wenn dies nicht der Fall ist, kann Bash den Befehlsverlauf nirgendwo speichern.

Wenn ".bash_history" nicht vorhanden ist, erstellen Sie es durch Ausführen von "touch":

touch ~/.bash_history

Dadurch wird lediglich die leere Datei .bash_history in Ihrem Ausgangsverzeichnis erstellt, die Ihre Befehle enthält und zwischen den Sitzungen bestehen bleiben sollte.

Ray Shah
quelle
0

Meine Amazon EC2 Ubuntu-Instanz hat den Verlauf nicht gespeichert. .bashrchatte alle erforderlichen Befehle, wie in anderen Antworten erwähnt, aber das einzige, was fehlte, war die Datei. Ich musste es anfassen, damit es funktionierte.

touch ~/.bash_history
Chankey Pathak
quelle
-1

Eine gute Antwort auf diese Frage finden Sie hier:

http://linuxcommando.blogspot.com/2007/11/keeping-command-history-across-multiple.html

DanJ
quelle
3
Willkommen bei SuperUser! Bitte geben Sie in Ihrer Antwort genügend Informationen an, damit der Fragesteller nicht auf einen externen Link klicken muss. Stellen Sie außerdem sicher, dass Ihre Antwort vorhandene Antworten nicht einfach dupliziert (was nach einem kurzen Blick auf diesen Link tatsächlich der Fall zu sein scheint).
Indrek
// Sieht aus wie ein guter Artikel. Aber ich denke, StackExchange versucht, zumindest ein wenig unabhängig von Link-Zielen zu sein. Möchtest du eine kleine Erklärung hinzufügen?
Nathan Basanese