Я действительно наслаждаюсь control+r
рекурсивным поиском в моей истории команд. Я нашел несколько хороших вариантов, которые мне нравится использовать с ним:
# ignore duplicate commands, ignore commands starting with a space
export HISTCONTROL=erasedups:ignorespace
# keep the last 5000 entries
export HISTSIZE=5000
# append to the history instead of overwriting (good for multiple connections)
shopt -s histappend
Единственная проблема для меня состоит в том, что erasedups
стираются только последовательные дубликаты - так что с этой строкой команд:
ls
cd ~
ls
Команда ls
будет записана дважды. Я думал о периодическом запуске w / cron:
cat .bash_history | sort | uniq > temp.txt
mv temp.txt .bash_history
Это приведет к удалению дубликатов, но, к сожалению, порядок не будет сохранен. Если я sort
сначала не верну файл, я не верю, что он uniq
может работать должным образом.
Как я могу удалить дубликаты в моем .bash_history, сохраняя порядок?
Дополнительный кредит:
Есть ли проблемы с перезаписью .bash_history
файла через скрипт? Например, если вы удалите файл журнала apache, я думаю, что вам нужно отправить сигнал nohup / reset, kill
чтобы он сбрасывал соединение с файлом. Если это так с .bash_history
файлом, возможно, я мог бы каким-то образом использовать его, ps
чтобы проверить и убедиться в отсутствии подключенных сеансов до запуска сценария фильтрации?
ignoredups
вместо того,erasedups
чтобы некоторое время, и посмотрите, как это работает для вас.history
команды. Где я должен искать?Ответы:
Сортировка истории
Эта команда работает как
sort|uniq
, но держит линии на местеВ основном, к каждой строке добавляется свой номер. После
sort|uniq
-ing все строки сортируются в соответствии с их исходным порядком (с использованием поля номера строки), и поле номера строки удаляется из строк.Это решение имеет недостаток, заключающийся в том, что он не определен, какой представитель класса равных линий сделает его на выходе, и, следовательно, его позиция в конечном выводе не определена. Однако, если будет выбран последний представитель, вы можете
sort
ввести с помощью второй клавиши:Управление .bash_history
Для перечитывания и записи истории вы можете использовать
history -a
иhistory -w
соответственно.источник
sort
этом-r
переключатель всегда меняет порядок сортировки. Но это не даст желаемого результата.sort
расценивает два вхожденияls
как идентичные с результатом, который, даже когда полностью изменен, возможный порядок зависит от алгоритма сортировки. Но посмотрите мое обновление для другой идеи.nl
в начале каждой строки кода? Не должно ли это бытьhistory
?Поэтому я искал точно такую же вещь после раздражения от дубликатов и обнаружил, что если я отредактирую свой ~ / .bash_profile (Mac) с помощью:
Он делает именно то, что вы хотели, он сохраняет только самые последние команды.
ignoreboth
на самом деле так же, как делать,ignorespace:ignoredups
и это вместе сerasedups
выполнением работы.По крайней мере, на моем Mac-терминале с Bash эта работа отлично. Нашел это здесь на askubuntu.com .
источник
Нашел это решение в дикой природе и протестировал:
При первом появлении определенного значения строки ($ 0) значение x [$ 0] равно нулю.
Нулевое значение инвертируется
!
и становится единым.Оператор, который оценивает один, вызывает действие по умолчанию, которое является печатью.
Поэтому, когда в первый раз
$0
виден конкретный , он печатается.Каждый раз, когда (повторяется) значение
x[$0]
isrrented,его отрицательное значение равно нулю, а оператор, который оценивается как ноль, не печатается.
Чтобы сохранить последнее повторенное значение, измените историю и используйте тот же awk:
источник
Расширяя ответ Клейтона:
tac
переверните файл, убедитесь, что вы установили его,moreutils
чтобы он былsponge
доступен, в противном случае используйте временный файл.источник
brew install coreutils
и обратите внимание, что все утилиты GNU имеют предварительноg
добавленные символы, чтобы избежать путаницы со встроенными командами Mac для BSD (например, gsed - это GNU, а sed - это BSD). Так что пользуйтесьgtac
.Это сохранит последние дублированные строки:
источник
Это старый пост, но это постоянная проблема для пользователей, которые хотят иметь несколько открытых терминалов и синхронизировать историю между окнами, но не дублировать их.
Мое решение в .bashrc:
history -n
читает все строки из $ HISTFILE, которые могли возникнуть в другом терминале с момента последнего возврата кареткиhistory -w
записывает обновленный буфер в $ HISTFILEhistory -c
стирает буфер, чтобы не возникало дублированияhistory -r
перечитывает $ HISTFILE, добавляя пустой буферtac
переворачивает его, а затем переворачивает обратно, чтобы его можно было сохранить с помощью самых последних команд, еще самых последних в историиКаждый раз, когда вы открываете новую оболочку, история стирает все дубликаты, и каждый раз, когда вы Enterнажимаете клавишу в другом окне оболочки / терминала, она обновляет эту историю из файла.
источник
Для уникальной записи каждой новой команды сложно. Сначала вы должны добавить
~/.profile
или аналогичный:Затем вам нужно добавить в
~/.bash_logout
:источник