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

9

Ho iniziato a utilizzare Mac di recente e prima di lavorare su Ubuntu.

Supponiamo di eseguire questi comandi uno per 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

Ora supponiamo di voler eseguire nuovamente python main.py , quindi farò clic sulla chiave su. Dovrò fare clic sulla chiave solo due volte su Ubuntu ma 7 volte su Mac.

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

Come posso farlo accadere su macOS?

    
posta Abhishek Agrawal 19.11.2017 - 11:18
fonte

3 risposte

13

Devi aggiungere la variabile di ambiente HISTCONTROL al tuo .bash_profile . Nel tuo .bash_profile aggiungi la seguente riga:

export HISTCONTROL=ignoreboth:erasedups

Chiudi e riavvia la sessione di bash e i duplicati dovrebbero sparire. In alternativa, puoi semplicemente eseguire quella stessa linea e avrà effetto per quella sessione (usala per provarla).

Dalla pagina di manuale per bash (in Terminale):

HISTCONTROL
A colon-separated list of values controlling how commands are saved on the history list. If the list of values includes ignorespace, lines which begin with a space character are not saved in the history list. A value of ignoredups causes lines matching the previous history entry to not be saved. A value of ignoreboth is shorthand for ignorespace and ignoredups. A value of erasedups causes all previous lines matching the current line to be removed from the history list before that line is saved. Any value not in the above list is ignored. If HISTCONTROL is unset, or does not include a valid value, all lines read by the shell parser are saved on the history list, subject to the value of HISTIGNORE. The second and subsequent lines of a multi-line compound command are not tested, and are added to the history regardless of the value of HISTCONTROL.

    
risposta data 19.11.2017 - 13:43
fonte
4

Perché succede?

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

Come ottenere lo stesso comportamento su macOS?

Se si desidera solo questa personalizzazione singola di "ignorare i duplicati esatti delle righe di comando" si può andare con qualcosa come la risposta di Allan, ad esempio aggiungere una singola riga per esempio il file bash_profile. Non esiste "il modo corretto" ma innumerevoli opzioni.

Se questa non è l'unica personalizzazione per la tua bash, allora potrebbe non essere l'opzione migliore:

  • ~/.bash_profile should be super-simple and just load .profile and .bashrc (in that order)

  • ~/.profile has the stuff NOT specifically related to bash, such as environment variables (PATH and friends)

  • ~/.bashrc has anything you'd want at an interactive command line. Command prompt, EDITOR variable, bash aliases for my use

A few other notes:

  • Anything that should be available to graphical applications OR to sh (or bash invoked as sh) MUST be in ~/.profile
  • ~/.bashrc must not output anything
  • Anything that should be available only to login shells should go in ~/.profile
  • Ensure that ~/.bash_login does not exist.

Ciò significa che quando le cose diventano più complesse è buona idea a distribuisci le personalizzazioni in più file, ciascuno specializzato e altamente ordinato nei loro contenuti:

Tutto exports può risiedere nel proprio file per una supervisione semplificata.

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

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

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

Sourcing files
If you have a lot of shell configurations, you may want to split them out into several subfiles and use the source builtin to load them from your .bashrc: with adding source ~/.exports to it.

In alternativa, per garantire che i file esistano realmente prima di caricare

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

Il comando . ~/.exports genererà ~/.exports nel contesto della shell attualmente in esecuzione.

This is particularly useful for adding aliases, the separate file makes it easier to re-load them when you make changes.

    
risposta data 19.11.2017 - 13:45
fonte
1

Per registrare in modo univoco ogni nuovo comando è difficile. Per prima cosa devi aggiungere ~/.profile o simile:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Quindi devi aggiungere a ~/.bash_logout :

history -a
history -w
    
risposta data 04.02.2018 - 00:18
fonte

Leggi altre domande sui tag