Cronologia di Bash non conservata tra le sessioni terminali su Mac


33

La mia storia di bash ha misteriosamente smesso di funzionare e non ho idea di come risolverlo. Ecco come appare il mio .bashrc:

HISTSIZE=500
HISTFILESIZE=500
HISTFILE=$HOME/.bash_history

Tuttavia, quando echo $HISTFILElo eseguo stampa /Users/myusername/.bash_sessions/EE8689E5-7DAD-4018-817E-0AF1DE36082A.historynew.

Sono il proprietario del file .bash_history, quindi non sono troppo sicuro di come risolvere il problema.

Grazie!


Ciao Nelson, benvenuto in Super User. Verifica rapida di quegli spazi da te inseriti?
bertieb,

sì, lo rimuoverò e riporterò indietro.

@bertieb, ho rimosso gli spazi e ora $ HISTFILESIZE è stato correttamente riprodotto. Tuttavia, la cronologia rimane non salvata e $ HISTFILE stampa quel file di cronologia temporanea dispari (che presumo memorizza la cronologia per quella sessione).

Stai cercando di cambiare $HISTFILE, per interesse? Non ho un .bashrcOSX e echo $HISTFILEriporta il posto che mi aspetterei: commentare le righe in questione ha qualche effetto?
bertieb,

1
Citare sempre espansioni variabili percorso: HISTFILE="$HOME/.bash_history”. Senza le virgolette, la tua versione non sarà valida se il percorso della tua home directory contiene spazi (o eventualmente altri caratteri speciali).
Chris Pagina

Risposte:


26

Il terminale assegna a ciascuna sessione del terminale un identificativo univoco e lo comunica tramite la variabile di ambiente TERM_SESSION_ID in modo che i programmi in esecuzione in un terminale possano salvare / ripristinare lo stato specifico dell'applicazione quando si chiude e si riavvia il Terminale con Riprendi abilitato.

Una nuova cartella (~ / .bash_sessions /) viene utilizzata per archiviare i file HISTFILE e .session che sono unici per le sessioni.

Durante l'avvio della shell viene eseguito il file di sessione. I vecchi file vengono periodicamente eliminati.

Il comportamento predefinito prevede il salvataggio e il ripristino della cronologia dei comandi bash in modo indipendente per ciascuna sessione del terminale ripristinata. Unisce inoltre i comandi nella cronologia globale per le nuove sessioni.

È possibile disabilitare questo comportamento e condividere una singola cronologia impostando

export SHELL_SESSION_HISTORY=0

Se viene definito HISTTIMEFORMAT, la cronologia per sessione è disabilitata per impostazione predefinita (leggi di più in / private / etc / bashrc_Apple_Terminal)

Il meccanismo di salvataggio / ripristino è disabilitato se esiste il seguente file:

~/.bash_sessions_disable

Apple ha già cambiato alcuni comportamenti dalla versione di El Capitan, quindi è meglio leggere di più qui less /private/etc/bashrc_Apple_Terminal


3
Ma non iniziare semplicemente disabilitando il meccanismo di salvataggio / ripristino. Se riscontri problemi con la cronologia dei comandi della shell, prova a risolverlo. Il ~/.bash_sessions_disablefile è da intendersi come ultima risorsa nel caso ci sia un problema che non può essere risolto in modo specifico. Disabilita più della sola cronologia dei comandi per sessione e puoi disabilitare solo la cronologia dei comandi per sessione. Vedi i commenti in /etc/bashrc_Apple_Terminalper i dettagli.
Chris Pagina

1
@ChrisPage In realtà Apple ha cambiato alcuni bit di script. Risposta aggiornata, grazie.
diimdeep,

@diimdeep Dove aggiungerei questa riga? export SHELL_SESSION_HISTORY=0
zerohedge

@zerohedge .bashrcand .bash_profile unix.stackexchange.com/a/310150/15362
diimdeep

@diimdeep Grazie. Questo sembra funzionare in questo momento. Ha qualche ramificazione?
zerohedge

6

Ho notato qualcosa di simile dopo l'aggiornamento di El Capitan. La semplice aggiunta del file .bash_sessions_disablenella directory home disattiva le nuove sessioni bash e .bash_historytorna in uso.

Questo thread di Reddit ha maggiori informazioni e ulteriori collegamenti.


Ma non iniziare semplicemente disabilitando il meccanismo di salvataggio / ripristino. Se riscontri problemi con la cronologia dei comandi della shell, prova a risolverlo. Il ~/.bash_sessions_disablefile è da intendersi come ultima risorsa nel caso ci sia un problema che non può essere risolto in modo specifico. Disabilita più della sola cronologia dei comandi per sessione e puoi disabilitare solo la cronologia dei comandi per sessione. Vedi i commenti in /etc/bashrc_Apple_Terminalper i dettagli.
Chris Pagina

Grazie Chris - cos'altro disabilita la mia storia ha funzionato come previsto (la stessa della precedente versione di OSX e la stessa di Linux) negli ultimi due mesi. Non sai perché l'hanno cambiato?
Rabs,

@rabs Suggerirei di aggiungere SHELL_SESSION_HISTORY=0in cima ~/.bash_profile.
Teejay,

5

Puoi risolvere il problema RVM aggiornando all'ultima versione RVM o eseguendo questo:

  echo 'shell_session_update' > $HOME/.bash_logout

Vedi https://github.com/rvm/rvm/issues/3540 per maggiori informazioni.


1
Bella soluzione, senza dover modificare rvm.
mlo55,

1
Stiamo parlando del Ruby enVironment Manager (RVM) rvm.io ?? Quando e perché dovrebbe essere coinvolto?
MarkHu,

3

Questa risposta dal thread di Reddit mi ha salvato:

Probabilmente è RVM che impedisce l'uscita "hook" per l'esecuzione di bash_sessions. Se scrivi la seguente riga nel tuo .bash_profile, dovrebbe funzionare.

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

Questo ha davvero aiutato!
Karsten,

1

Se è un Mac, suppongo che sia la shell di accesso predefinita bashe che funzioni .profileinvece di .bashrc. Quindi, stavi modificando il file sbagliato.


Ho modificato il file .profile, quindi è uguale al mio .bashrc e la cronologia non viene ancora visualizzata.

@NelsonLiu Cosa succede quando fai eco $HISTFILEin diverse parti di profile? Forse hai un altro script che cambia la variabile? Ho controllato entrambi Terminale iTerm, bash 3ed 4 entrambi hanno il loro valore predefinito $HOME/.bash_history.
theoden,

come farei eco a $ HISTFILE in diverse parti del profilo?

@NelsonLiu, non è ovvio? il tuo obiettivo è tracciare quando $HISTFILEcambia. Quindi, fai semplicemente echo $HISTFILEcircondare due il tuo codice. Quello che devi fare è trovare il pezzo di codice in cui $HISTFILEcambia spostando entrambe le echo $HISTFILElinee sempre più vicine tra loro fino a quando qualcosa non viene rivelato. È tutto.
theoden,

1
quindi ho fatto come hai richiesto e reso .bash_profile lo stesso del profilo. Ho deciso di farlo echo $HISTFILEsu ogni linea, solo per vedere se c'erano differenze. Tuttavia, ha semplicemente stampato /Users/username/.bash_historyuna miriade di volte. Ho quindi corso echo $HISTFILEnel guscio, ed è uscito /Users/nelsonliu/.bash_sessions/CD275A29-1DF1-4ED8-B8CE-F706B11B812F.historynew.

0

Stavo vedendo questo problema su High Sierra. In qualche modo, il mio .bash_history era diventato di proprietà di root e non aveva nemmeno i permessi di lettura per altri utenti (quando i contenuti della home directory venivano visualizzati con ls -al)

Non c'è stata alcuna conseguenza in questo file .bash_history, quindi ho fatto un sudo rm .bash_history seguito da un tocco .bash_history per crearne uno nuovo.

Adesso tutto sembra a posto


Per me, non erano i permessi dei file, era che non avevo definito nessuna delle variabili di controllo HIST. Apparentemente uno o più di essi devono essere definiti. Ho aggiunto questo al mio ~/.bash_profilefile:export HISTTIMEFORMAT='%F %T '
MarkHu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.