Прежде всего, это не дубликат существующих потоков в SE. Я читал эти две темы ( 1-я , 2-я ) о лучшей истории Bash, но ни один из ответов не работает - - Кстати, я нахожусь на Fedora 15.
Я добавил следующее в .bashrc
файл в каталоге пользователя (/ home / aahan /), и он не работает. У кого-нибудь есть подсказка?
HISTCONTROL=ignoredups:erasedups # no duplicate entries
HISTSIZE=1000 # custom history size
HISTFILESIZE=100000 # custom history file size
shopt -s histappend # append to history, don't overwrite it
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" # Save and reload the history after each command finishes
Хорошо, это то, что я хочу с историей bash (приоритет):
- не храните дубликаты, удалите все существующие
- немедленно делиться историей со всеми открытыми терминалами
- всегда добавлять историю, а не переписывать
- хранить многострочные команды как одну команду (по умолчанию она отключена)
- каков размер истории по умолчанию и размер файла истории?
bash
command-history
это я
источник
источник
echo $SHELL
). Работают ли настройки, если вы запускаете их вручную из открытой оболочки? Очевидно, что поскольку они работают для многих других, настройки верны, вы просто неправильно их реализуете. И никакая Fedora15 / Gnome3 /, являющаяся виртуальной машиной, не имеет ничего общего с реальной функциейbash
..bashrc
файл. Это неправильно? Можете ли вы добавить «ответ» к этому сообщению с помощью реальных команд оболочки? (пожалуйста,.bashrc
фактическими командами оболочки. Скрипты - это просто серии команд оболочки. Также редактирование, которое вы недавно сделали, удаливexport
бит, было плохой идеей, которую следует сохранить.Ответы:
На самом деле это действительно интересное поведение, и, признаюсь, в начале я сильно недооценил вопрос. Но сначала факты:
1. Что работает
Функциональность может быть достигнута несколькими способами, хотя каждый работает немного по-своему. Обратите внимание, что в каждом случае, чтобы история «передавалась» в другой терминал (обновлялся), нужно нажать Enterв терминале, где он / она хочет получить историю.
Опция 1:
Это имеет два недостатка:
вариант 2:
(Да, нет необходимости
shopt -s histappend
и да, это должно бытьhistory -c
в серединеPROMPT_COMMAND
) Эта версия также имеет два важных недостатка:history
может дать ложный вывод - см. Ниже.[Редактировать] "И победитель ..."
вариант 3:
Это насколько это возможно. Это единственный вариант, когда обе
erasedups
истории работают одновременно. Это , вероятно, окончательное решение всех ваших проблем, Ахан.2. Почему вариант 2 не работает (или: что на самом деле не работает, как ожидалось)?
Как я уже говорил, каждое из приведенных выше решений работает по-своему. Но самая неверная интерпретация того, как работают настройки, связана с анализом результатов
history
команды . Во многих случаях команда может дать ложный вывод. Почему? Потому что он выполняется перед последовательностью другихhistory
команд, содержащихся вPROMPT_COMMAND
! Однако при использовании второго или третьего варианта можно отслеживать изменения.bash_history
содержимого (watch -n1 "tail -n20 .bash_history"
например, используя) и видеть, какова реальная история.3. Почему вариант 3 такой сложный?
Все лежит в том, как
erasedups
работает. Как говорится в руководстве по bash, «(...)erasedups
вызывает удаление всех предыдущих строк, соответствующих текущей строке, из списка истории перед сохранением этой строки» . Так что это действительно то, чего хотел ОП (а не просто, как я думал ранее, чтобы не было дубликатов, появляющихся последовательно ) . Вот почему каждая изhistory -.
команд должна или не может быть вPROMPT_COMMAND
:history -n
должен быть там, прежде чемhistory -w
читать из.bash_history
команд, сохраненных с любого другого терминала,history -w
имеет быть там, чтобы сохранить историю в файл и удалить дубликаты,history -a
не должны быть помещены туда вместоhistory -w
, потому что это не вызывает стирание дубликатов,history -c
также необходимо, потому что это предотвращает разрушение буфера истории после каждой команды,и , наконец,
history -r
это необходимо для восстановления буфера истории из файла, таким образом , наконец , что делает историю совместную через терминальные сессии.источник
watch "tail -n 20 .bash_history"
вместоtail -f .bash_history
.history -c
также необходим, потому что он предотвращает уничтожение буфера истории после каждой команды. Почему происходит такое удаление?В вашей командной строке вы используете
-c
переключатель. Отman bash
:Чтобы поделиться своей историей со всеми открытыми терминалами, вы можете использовать
-n
:Размер по умолчанию также указан в руководстве:
Чтобы сохранить многострочные команды:
Кроме того, вы не должны вводить команды HIST * предваряющим
export
- они являются переменными только для bash, а не переменными среды:HISTCONTROL=ignoredups:erasedups
достаточно.источник
export PROMPT_COMMAND="history -a; history -n; history -r; $PROMPT_COMMAND"
правильно? Кроме того, знаете ли вы, как я могу заставить файл истории хранить многострочные команды как одну команду (которая по умолчанию отключена) ??shopt -s cmdhist
сохранит несколько строк.HISTCONTROL=ignoredups:erasedups
не работает. Я также попытался иметь только это в.bashrc
файле (среди пользовательских функций). Есть идеи, что может быть не так? Я использую Fedora 15 на виртуальной машине - - Windows 7 host./etc/bashrc
, и.bash_profile
т. Д., Нет ничего, что могло бы его переопределить..bash_profile
файлом. Что касается содержания, которое/etc/bashrc
я поместил здесь, пожалуйста, посмотрите - pastebin.com/Uae6sE6sЭто то, что я придумал, и я доволен этим до сих пор ...
ПРИМЕЧАНИЯ:
HISTIGNORE
игнорирует все команды, которые не имеют аргументов. Это может быть нежелательным для некоторых людей и может быть опущено.источник
Используйте это вместо:
источник
Это не работает, потому что вы забыли о:
Но, кажется
history -n
, просто глючит, когдаexport HISTCONTROL=ignoreboth:erasedups
действует.Давайте поэкспериментируем:
Здесь мы включаем удаление дубликатов, переключаем историю в пользовательский файл, очищаем историю. После завершения всех команд у нас есть пустой файл истории и одна команда в текущей истории.
Откройте второй терминал и выполните эти шесть команд тоже. После того:
Теперь в вашей текущей истории есть две команды, а в файле истории:
Вернуться к первому терминалу:
Хм ... ни одна из
echo
команд не читается. Снова переключитесь на второй терминал и:Теперь файл истории:
Снова переключитесь на первый терминал:
Вы можете видеть, что
echo "Z"
команда объединена сhistory -n
.Другая ошибка связана с тем, что команды считываются из истории по номеру команды, а не по времени команды, я думаю. Я ожидаю, что другие
echo
команды появились в историиисточник
erasedups не обрезает (как chomp в некоторых языках) начальные и конечные пробелы. Это ошибка. Также erasedups не удаляет все предыдущие записи.
источник