Dlaczego terminal Mac pamięta dwa kolejne polecenia, gdy są one takie same?

10

Zacząłem używać komputera Mac niedawno i zanim zacząłem pracować na Ubuntu.

Załóżmy, że uruchamiam te polecenia jeden po drugim na moim terminalu:

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

Załóżmy teraz, że chcę uruchomić python main.pyponownie, więc kliknę klawisz up. Będę musiał kliknąć klucz dwa razy na Ubuntu, ale 7 razy na Macu.

Jeśli dwa kolejne polecenia są takie same, terminal powinien zapamiętać tylko jedno polecenie zamiast dwóch różnych poleceń.

Jak mogę to zrobić na MacOS?

as2d3
źródło
6
Po prostu pedantyczny, tak naprawdę nie robi tego terminal Mac. To bash, twoja powłoka działa w terminalu. Istnieje wiele powłok i możliwe i powszechne jest zastępowanie domyślnej powłoki na coś innego, zsha nawet dostosowanie zsh za pomocą różnych skryptów.
gman

Odpowiedzi:

13

Musisz dodać zmienną środowiskową HISTCONTROL do swojej .bash_profile. W swoim .bash_profiledodaj następujący wiersz:

export HISTCONTROL=ignoreboth:erasedups

Zamknij i uruchom ponownie sesję bash, a duplikaty powinny zniknąć. Alternatywnie, możesz po prostu wykonać ten sam wiersz i zadziała on dla tej sesji (użyj go do przetestowania).


Ze strony podręcznika dlabash (w terminalu):

HISTCONTROL Rozdzielona
dwukropkami lista wartości kontrolujących sposób zapisywania poleceń na liście historii. Jeśli lista wartości zawiera ignorowanie , linie zaczynające się od spacji nie są zapisywane na liście historii. Wartość zignorowanych powoduje, że wiersze pasujące do poprzedniego wpisu historii nie są zapisywane. Wartość ignoreboth jest skrótem ignorespace i ignoredups . Wartość wymazanych danych powoduje usunięcie wszystkich poprzednich wierszy pasujących do bieżącego wiersza z listy historii przed zapisaniem tego wiersza. Wszelkie wartości niewymienione na powyższej liście są ignorowane. Jeśli HISTCONTROLjest nieustawiony lub nie zawiera prawidłowej wartości, wszystkie wiersze odczytane przez analizator powłoki są zapisywane na liście historii, z zastrzeżeniem wartości HISTIGNORE . Drugi i kolejne wiersze polecenia złożonego z wielu wierszy nie są testowane i są dodawane do historii niezależnie od wartości HISTCONTROL .

Allan
źródło
4

Dlaczego to się dzieje?

MacOS i Ubuntu są skonfigurowane inaczej, aby obsługiwać duplikaty w historii poleceń bash. Te konfiguracje są przechowywane w wielu tak zwanych „ plikach kropkowych ”. Mają one postać ~ / .bash *, a także ogólnosystemowy profil / etc /. Wszystkie te pliki można dostosować do własnych upodobań i odróżniać powłoki interaktywne, powłoki logowania, powłoki zdalne itp. Pliki te są odczytywane w określonej kolejności i pełnią określone funkcje.

Jak uzyskać takie samo zachowanie w systemie macOS?

Jeśli chcesz tylko tego, pojedynczego dostosowania „ignorowania dokładnych duplikatów wiersza poleceń”, możesz przejść z odpowiedzią Allana, tj. Dodać pojedynczą linię na przykład do pliku bash_profile. Nie ma „właściwej drogi”, ale niezliczone opcje.

W przypadku, gdy nie jest to jedyne dostosowanie Twojego basha, może to nie być najlepsza opcja:

Kilka innych uwag:

  • Wszystko, co powinno być dostępne dla aplikacji graficznych LUB dla sh (lub bash wywoływanego jako sh) MUSI znajdować się w ~ / .profile
  • ~ / .bashrc nie może niczego wypisywać
  • Wszystko, co powinno być dostępne tylko do logowania, powinno znajdować się w ~ / .profile
  • Upewnij się, że ~ / .bash_login nie istnieje.

Oznacza to, że gdy sprawy stają się bardziej złożone, dobrym pomysłem jest rozłożenie dostosowań na wiele plików, z których każdy jest specjalistyczny i wysoce uporządkowany pod względem zawartości:

Wszystkie exportsmogą znajdować się we własnych plikach w celu uproszczenia nadzoru.

Utwórz plik odczytywany przez bash w katalogu głównym katalogu użytkownika, na przykład o nazwie, .exportsktóry zawiera:

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

Musi to być „źródło”, aby plik był odczytywany przez bash podczas interaktywnego uruchamiania:

Pliki
źródłowe Jeśli masz wiele konfiguracji powłoki, możesz podzielić je na kilka podtekstów i użyć wbudowanego źródła, aby załadować je z .bashrc: z dodaniem source ~/.exportsdo niego.

Alternatywnie, aby upewnić się, że pliki faktycznie istnieją przed załadowaniem

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

Komenda . ~/.exportspobierze źródło ~/.exportsw kontekście aktualnie uruchomionej powłoki.

Jest to szczególnie przydatne w przypadku dodawania aliasów, ponieważ oddzielny plik ułatwia ich ponowne ładowanie po wprowadzeniu zmian.

LаngLаngС
źródło
2
Jak .exportsczytać (pozyskiwać)?
fd0,
1
@ fd0, sam w sobie nie jest pozyskiwany w macOS. Odpowiedź Allana jest właściwym sposobem na osiągnięcie tego.
user3439894,
Jeśli wartość HISTCONTROLjest ustawiona na .bashrci ~/.bashrcjest pozyskiwane w ~/.bash_profileczym nie ma potrzeby, aby exportw HISTCONTROLzmiennej. Zarówno interaktywna powłoka logowania, jak i interaktywna powłoka będą miały ustawione zmienne.
fd0,
@ fd0 Dokładnie: if . / W przypadku, gdy nie rozumiem: Moim celem było zapewnienie alt dla jednocześnie publikowanego przez Allana A / i utrzymanie esp _profile, ale także pozostałych tak czystych i uporządkowanych, jak to możliwe, ponieważ jest to scenariusz, w którym rozważa się wiele opcji / ustawień. Czy twoim ostatnim punktem jest sugestia do dodania lub oznaczona jako korekta, ponieważ możesz postrzegać powyższą metodę jako „niewłaściwą”? Czytam teraz twój komentarz między moim a Allanem pod względem złożoności?
LаngLаngС
1

Jednoznaczne zarejestrowanie każdego nowego polecenia jest trudne. Najpierw musisz dodać ~/.profilelub podobne:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Następnie musisz dodać do ~/.bash_logout:

history -a
history -w
Steven Penny
źródło