Чому Mac Terminal запам'ятовує дві послідовні команди, коли вони однакові?


10

Я почав використовувати Mac недавно, і раніше, ніж я працював над Ubuntu.

Припустимо, я виконую ці команди по черзі на своєму терміналі:

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

Тепер припустимо, що я хочу запустити python main.pyще раз, тому я натисну клавішу вгору. Мені потрібно буде натиснути клавішу лише два рази на Ubuntu, але 7 разів на Mac.

Якщо дві послідовні команди однакові, то термінал повинен запам'ятати лише одну команду, а не запам'ятовувати дві різні команди.

Як я можу це зробити на macOS?


6
Тільки до педантичного, це насправді не mac-термінал. Це баш, ваша оболонка працює в терміналі. Оболонок багато, і можливо, звичайно замінити оболонку за замовчуванням на щось інше, як zshі навіть далі, щоб налаштувати zsh з різними сценаріями.
gman

Відповіді:


13

Вам потрібно додати змінну середовища HISTCONTROL до своєї .bash_profile. У вашому .bash_profileдодати наступний рядок:

export HISTCONTROL=ignoreboth:erasedups

Закрийте і перезапустіть свій баш-сеанс, а мантий не повинно бути більше. Крім того, ви можете просто виконати цей самий рядок, і він набере чинності для цього сеансу (скористайтеся ним для тестування).


З сторінки керівництва дляbash (у Терміналі):

HISTCONTROL
- розділений двокрапкою список значень, що керують тим, як команди зберігаються у списку історії. Якщо список значень включає простір ігнорування , рядки, які починаються із символу пробілу, не зберігаються у списку історії. Значення ігнорованих змушує рядки, що відповідають попередньому запису історії, не зберігаються. Значення ignoreboth - це стенограма для простору ігнорування та ігнорування . Значення стирань призводить до того, що всі попередні рядки, що відповідають поточному рядку, будуть видалені зі списку історії до збереження цього рядка. Будь-яке значення, яке не є у наведеному вище списку, ігнорується. Якщо ІСТКОНТРОЛне встановлено або не включає дійсне значення, всі рядки, прочитані аналізатором оболонки, зберігаються у списку історії, залежно від значення HISTIGNORE . Другий і наступні рядки багаторядкової складеної команди не перевіряються і додаються в історію незалежно від значення HISTCONTROL .


4

Чому це відбувається?

MacOS і Ubuntu налаштовані по-різному поза коробкою для обробки дублікатів в історії команд bash. Ці конфігурації зберігаються в ряді так званих " точкових файлів ". Вони також мають форму ~ / .bash *, а також системний / etc / profile. Усі ці файли можуть бути налаштовані на ваш смак та розрізняти інтерактивні оболонки, вхідні оболонки, віддалені оболонки тощо. Ці файли читаються у певному порядку та виконують певні функції.

Як отримати таку саму поведінку на macOS?

Якщо ви хочете саме цього, єдиного налаштування "ігнорування точних дублікатів командних рядків", ви можете виконати щось на зразок відповіді Аллана, тобто додати один єдиний рядок, наприклад, ваш файл bash_profile. Існує не "правильний шлях", але незліченна кількість варіантів.

Якщо це не єдине налаштування для вашого bash, це може бути не найкращим варіантом:

Кілька інших приміток:

  • Все, що повинно бути доступним для графічних додатків АБО до sh (або bash, що викликається sh), ОБОВ'ЯЗКОВО бути в ~ / .profile
  • ~ / .bashrc нічого не повинен виводити
  • Все, що повинно бути доступним лише для оболонок для входу, має містити ~ / .profile
  • Переконайтесь, що ~ / .bash_login не існує.

Це означає , що, коли ситуація стає більш складною це гарна ідея , щоб розкласти в налаштуваннях на кілька файлів, кожен з яких спеціалізується і високоупорядоченние в їх зміст:

Усі exportsможуть перебувати у власному файлі для спрощеного контролю.

Створіть файл, який читається bash в корені вашого каталогу користувачів, наприклад, який називається .exports:

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

Це потрібно "знайти", щоб файл читався bash при інтерактивному запуску:

Пошукові файли
Якщо у вас багато конфігурацій оболонок, ви можете розбити їх на декілька підфайлів і використовувати вбудований джерело для завантаження їх із вашого .bashrc: з додаванням source ~/.exportsдо нього.

Крім того, щоб переконатися, що файли існують перед завантаженням

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

Команда . ~/.exportsбуде джерелом ~/.exportsу контексті поточно запущеної оболонки.

Це особливо корисно для додавання псевдонімів, окремий файл полегшує їх повторну завантаження під час внесення змін.


2
Як .exportsчитати (джерело)?
fd0

1
@ fd0, сам по собі він не отримується в macOS. Відповідь Аллана - це правильний спосіб досягти цього.
користувач3439894

Якщо значення HISTCONTROLвстановлено в .bashrcі ~/.bashrcнадходять в ~/.bash_profileтому немає ніякої необхідності exportв HISTCONTROLзмінному. І інтерактивна оболонка для входу, і інтерактивна оболонка матимуть набір змінних.
fd0

@ fd0 Точно так: якщо . / У випадку, якщо я не розумію: моя мета полягала в тому, щоб надати альт одночасно розміщеному Alan & Alan і зберігати esp _profile, але й решту максимально чисто та акуратно, оскільки це для сценарію, де розглядається безліч варіантів / налаштувань. Чи є ваш останній пункт пропозицією додати чи поправити як виправлення, оскільки ви можете сприймати описаний вище метод як "неправильний"? Тепер я читаю ваш коментар, як між моїм та Алланом за рівнем складності, про який йдеться?
LаngLangС

1

Uniqely записувати кожну нову команду складно. Спочатку потрібно додати ~/.profileабо подібне:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Потім потрібно додати до ~/.bash_logout:

history -a
history -w
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.