Perché Mac Terminal ricorda due comandi consecutivi quando sono uguali?


10

Ho iniziato a usare Mac di recente e prima lavoravo su Ubuntu.

Supponiamo di eseguire questi comandi uno ad uno sul mio terminale:

python3 main.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py

Supponiamo ora di voler eseguire di python main.pynuovo, quindi farò clic sul tasto Su. Dovrò fare clic sulla chiave solo due volte su Ubuntu ma 7 volte su Mac.

Se due comandi consecutivi sono uguali, il terminale dovrebbe ricordare solo un comando invece di ricordare due comandi diversi.

Come posso farlo accadere su macOS?


6
Solo per pedante, non è in realtà mac terminal che lo sta facendo. È bash, la tua shell è in esecuzione nel terminale. Esistono molte shell ed è possibile e comune sostituire la shell predefinita con qualcos'altro simile zshe persino personalizzare zsh con vari script.
Gman,

Risposte:


13

Devi aggiungere la variabile d'ambiente HISTCONTROL alla tua .bash_profile. Nel tuo .bash_profileaggiungere la seguente riga:

export HISTCONTROL=ignoreboth:erasedups

Chiudi e riavvia la sessione bash e i duplicati dovrebbero sparire. In alternativa, potresti semplicemente eseguire quella stessa riga e avrà effetto per quella sessione (usala per testarla).


Dalla paginabash del manuale per (nel Terminale):

HISTCONTROL
Un elenco di valori separati da due punti che controllano il modo in cui i comandi vengono salvati nell'elenco della cronologia. Se l'elenco di valori include ignorespace , le righe che iniziano con un carattere spazio non vengono salvate nell'elenco cronologico. Un valore di ignoredups fa sì che le righe corrispondenti alla voce della cronologia precedente non vengano salvate. Un valore di ignoreboth è una scorciatoia per ignorespace e ignoredups . Un valore di cancellazioni fa sì che tutte le righe precedenti corrispondenti alla riga corrente vengano rimosse dall'elenco cronologico prima che tale riga venga salvata. Qualsiasi valore non presente nell'elenco precedente viene ignorato. Se HISTCONTROLnon è impostato o non include un valore valido, tutte le righe lette dal parser della shell vengono salvate nell'elenco cronologico, soggetto al valore di HISTIGNORE . La seconda e le successive righe di un comando composto su più righe non vengono testate e vengono aggiunte alla cronologia indipendentemente dal valore di HISTCONTROL .


4

Perché succede?

MacOS e Ubuntu sono configurati in modo diverso e pronto all'uso per gestire i duplicati nella cronologia dei comandi di bash. Queste configurazioni sono memorizzate in un numero di cosiddetti " file dot ". Questi assumono la forma di ~ / .bash * e anche il profilo di sistema / etc /. Tutti questi file possono essere personalizzati a proprio piacimento e differenziati tra shell interattive, shell di login, shell remote ecc. Questi file vengono letti in un ordine specifico e servono funzioni specifiche.

Come ottenere lo stesso comportamento su macOS?

Se vuoi solo questo, una singola personalizzazione di "ignorare i duplicati esatti delle righe di comando" puoi andare con qualcosa come la risposta di Allan, cioè aggiungere una singola riga singola per esempio al tuo file bash_profile. Non esiste "il modo corretto" ma innumerevoli opzioni.

Nel caso in cui questa non sia l'unica personalizzazione per il tuo bash, questa potrebbe non essere l'opzione migliore:

Alcune altre note:

  • Tutto ciò che dovrebbe essere disponibile per applicazioni grafiche O per sh (o bash invocato come sh) DEVE essere in ~ / .profile
  • ~ / .bashrc non deve produrre nulla
  • Tutto ciò che dovrebbe essere disponibile solo per accedere alle shell dovrebbe andare in ~ / .profile
  • Assicurarsi che ~ / .bash_login non esista.

Ciò significa che, quando le cose si fanno più complesse, è buona idea per diffondere le personalizzazioni in più file, ognuno dei quali specializzato e altamente ordinato nei loro contenuti:

Tutti exportspossono risiedere nel proprio file per una supervisione semplificata.

Crea un file letto da bash nella directory principale della tua directory utente, ad esempio chiamato .exportsche contiene:

# Omit duplicates and commands that begin with a space from history.
export HISTCONTROL='ignoreboth'; 

Questo deve essere "di provenienza" in modo che il file venga letto da bash all'avvio interattivo:

Sourcing dei file
Se si hanno molte configurazioni della shell, è possibile dividerle in più file secondari e utilizzare il sorgente incorporato per caricarli dal proprio .bashrc: con l'aggiunta source ~/.exportsad esso.

In alternativa, per garantire che i file esistano effettivamente prima del caricamento

if [ -f ~/.exports ]; then
. ~/.exports
fi

Il comando . ~/.exportsverrà generato ~/.exportsnel contesto della shell attualmente in esecuzione.

Ciò è particolarmente utile per l'aggiunta di alias, il file separato semplifica il loro nuovo caricamento quando si apportano modifiche.


2
Come .exportsviene letto (di provenienza)?
f0,

1
@ fd0, di per sé, non viene fornito in macOS. La risposta di Allan è un modo corretto per raggiungere questo obiettivo.
user3439894

Se il valore di HISTCONTROLè impostato .bashrced ~/.bashrcè di provenienza, ~/.bash_profilenon è necessario per exportla HISTCONTROLvariabile. Sia una shell di login interattiva che una shell interattiva avranno la variabile impostata.
fd0

@ fd0 Esatto: se . / Nel caso in cui non capissi: il mio punto era quello di fornire un alt al profilo A di Allan pubblicato simultaneamente / mantenendo il profilo esp _ ma anche il resto il più pulito e ordinato possibile perché questo è per uno scenario in cui vengono considerate molte opzioni / impostazioni. Il tuo ultimo punto è un suggerimento da aggiungere o inteso come una correzione in quanto potresti percepire il metodo sopra come "sbagliato"? Ora, ho letto il tuo commento tra il mio e quello di Allan nel livello di complessità affrontato?
LängLаngС,

1

Registrare in modo univoco ogni nuovo comando è complicato. Per prima cosa devi aggiungere ~/.profileo simili:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Quindi devi aggiungere a ~/.bash_logout:

history -a
history -w
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.