1

Bash в Fedora 19 действительно раздражает меня. Скажем, я запускаю команду:

echo "Hello"

Затем я запускаю другую команду:

echo "World"

Теперь я бегу последнюю команду echo "World" еще раз N раз, нажав на клавиатуре, а затем ввести. (Типичное использование.)

Проблема в том, что каждая из этих эхо- команд echo "World" вставляется в историю, даже если они идентичны. Я хочу просто нажать дважды и получить up Вместо этого я должен нажать echo "Hello" N+1 раз.

Почему это сломано? Как мне это исправить?

4 ответа4

2

Для уникальной записи каждой новой команды сложно. Сначала вам нужно добавить в ~/.profile или аналогичный:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Затем вам нужно добавить в ~/.bash_logout:

history -a
history -w
1

Я не знаю, как решить эту проблему, но я дам вам альтернативу гораздо лучше. Сделайте это с помощью "Ctrl+r echo" и итерируйте свои напечатанные версии с помощью "Ctrl+r". Это быстрее, и когда вы получите хитрость, вам понравится.

пример

Ctrl+ R эхо

Промо шоу: "Мир эха", если это не то, что вы хотите, нажмите еще раз Ctrl+ r

Промо шоу: "эхо привет", если это не то, что вы хотите, нажмите Ctrl+ r. Если это то, что вы хотите, просто нажмите Enter.

И вам не нужно начинать свое слово по порядку, вы можете сделать:

Ctrl+r World

и приглашение покажет "Мир эха", и вы можете нажать Enter, чтобы выполнить его.

Так просто.

1

Это «не работает», потому что каждая команда вводится в историю по умолчанию, как указывал @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 игнорирует короткие команды. Я считаю, что набрать 'Up Arrow' для получения команды, подобной ls , не намного короче, поэтому я предпочитаю вообще не хранить команды из одной-трех букв. Кроме того, все, что начинается с пробела, не будет сохранено в истории. Я использую это для одноразовых команд.

Обратите внимание, что дубликаты могут все еще накапливаться, если у вас есть несколько открытых сеансов одновременно. Время от времени я удаляю дубликаты из файла истории со следующими однострочниками:

tac ~/.bash_history | awk '!seen[$0]++' | tac > .tmp.newhist && mv .tmp.newhist ~/.bash_history
0

История Bash не может различить дублированные команды. Все команды записаны в истории. Один из способов быстро получить требуемую команду - это:

set -o vi

введите ESC , затем /hello выдаст вам самую последнюю команду со строкой "hello". Используйте стрелку вверх, чтобы перечислить предыдущие команды, соответствующие строке "привет". Другие команды vi могут использоваться для поиска / навигации по командам.

Если это полезно, можно set -o vi в .bashrc в вашем HOME каталоге.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .