Для уникальной записи каждой новой команды сложно. Сначала вам нужно добавить ~/.profile
или аналогичный:
HISTCONTROL=erasedups PROMPT_COMMAND='history -w'
Затем вам нужно добавить в ~/.bash_logout
:
history -a history -w
Bash в Fedora 19 действительно раздражает меня. Скажем, я запускаю команду:
echo "Hello"
Затем я запускаю другую команду:
echo "World"
Теперь я echo "World"
снова запускаю последнюю команду ( ) N раз, нажимая up
на клавиатуре, а затем вводя. (Типичное использование.)
Проблема в том, что каждая из этих echo "World"
команд вставляется в историю, даже если они идентичны. Я хочу просто нажать up
два раза и получить echo "Hello"
. Вместо этого я должен нажать up
N + 1 раз.
Почему это сломано? Как мне это исправить?
Для уникальной записи каждой новой команды сложно. Сначала вам нужно добавить ~/.profile
или аналогичный:
HISTCONTROL=erasedups PROMPT_COMMAND='history -w'
Затем вам нужно добавить в ~/.bash_logout
:
history -a history -w
Я не знаю, как решить эту проблему, но я дам вам альтернативу гораздо лучше. Сделайте это с помощью "Ctrl + r echo" и итерируйте свои напечатанные версии с помощью "Ctrl + r". Это быстрее, и когда вы получите хитрость, вам понравится.
пример
Ctrl + R эхо
Промо шоу: «Мир эха», если это не то, что вы хотите, нажмите еще раз Ctrl + r
Промо шоу: «эхо привет», если это не то, что вы хотите, нажмите Ctrl + r. Если это то, что вы хотите, просто нажмите Enter.
И вам не нужно начинать свое слово по порядку, вы можете сделать:
Ctrl + r World
и приглашение покажет «Мир эха», и вы можете нажать Enter, чтобы выполнить его.
Так просто.
Это «не работает», потому что каждая команда вводится в историю по умолчанию, как указывал @suspectus.
Однако вы можете указать Bash удалить дубликаты, установив переменную Bash HISTCONTROL
. (Документация: http://www.gnu.org/software/bash/manual/bashref.html#Bash-Variables ). Это разделенный двоеточиями список из нуля или более ключевых слов, который вам, скорее всего, будет интересен erasedups
. Обратите внимание, что затрагивается только история, введенная в текущих сеансах . Настройка HISTCONTROL=erasedups
не вернется и не удалит дубликаты из ваших предыдущих сессий (но поищите другое решение ниже). Также обратите внимание, что HISTCONTROL
это переменная Bash, и ее не нужно экспортировать.
Для чего это стоит, мои настройки:
HISTCONTROL=ignoreboth:erasedups HISTIGNORE="?:??:???:$HISTIGNORE" HISTSIZE=5000
Я начал использовать эти настройки, потому что меня раздражали многие тривиальные и повторяющиеся команды, выталкивающие тщательно созданные команды «из списка». HISTIGNORE
Параметр игнорирует короткие команды. Я считаю, что набрать 'Стрелку вверх' для получения такой команды не намного короче ls
, поэтому я предпочитаю вообще не хранить команды из одной-трех букв. Кроме того, все, что начинается с пробела, не будет сохранено в истории. Я использую это для одноразовых команд.
Обратите внимание, что дубликаты могут все еще накапливаться, если у вас есть несколько открытых сеансов одновременно. Время от времени я удаляю дубликаты из файла истории со следующими однострочниками:
tac ~/.bash_history | awk '!seen[$0]++' | tac > .tmp.newhist && mv .tmp.newhist ~/.bash_history
История Bash не может различить дублированные команды. Все команды записаны в истории. Один из способов быстро получить требуемую команду - это:
set -o vi
введите ESC
, а затем /hello
даст вам самую последнюю команду со строкой "привет". Используйте стрелку вверх, чтобы перечислить предыдущие команды, соответствующие строке «привет». Другие команды vi могут использоваться для поиска / навигации по командам.
Если это полезно, set -o vi
можно добавить в .bashrc в вашем HOME
каталоге.