Редактирование истории в ударе

В ударе, когда я возвращаюсь в истории, редактируют некоторую команду и выполняют его, эта отредактированная команда добавляется к истории, и исходный оставляют неповрежденным. Но время от времени мне так или иначе удается влиять на исходную команду, т.е. мое редактирование заменяет исходную команду назад в истории. Я не могу указать на то, как это происходит. Кто-то может объяснить? Моя цель состоит в том, чтобы избежать этого, таким образом, любое редактирование к предыдущей команде всегда добавляется к истории и никогда не заменяет оригинал.

15
задан ultracrepidarian 16 March 2010 в 13:02
поделиться

3 ответа

Вот мой ответ. Пожалуйста, исправьте или предоставьте дополнительные сведения, если можете.

Когда в bash задана опция «vi» («set -o vi» - «Использовать интерфейс редактирования командной строки в стиле vi»), есть два режима редактирования команды из истории.

Первый режим (назовем его «базовым») - это когда вы сразу начинаете редактирование, используя Backspace, Del и символьные клавиши.

Другой режим - это «режим vi», в который вы входите, когда вы нажимаете Esc.

Если вы хотите сохранить свою историю нетронутой, НЕ используйте оба режима в одном редактировании. Я не знаю, как в точности работает bash, но вы можете думать об этом так:

  1. При входе в «режим vi» к исходной команде применяются любые изменения, сделанные в «базовом режиме», и создается копия команды, которая вы можете редактировать дальше, используя команды в стиле vi.
  2. Изменения применяются, когда вы нажимаете Enter (выполнить), Up, Down или j, k (переход к другой команде в истории).
  3. Изменения не применяются, если вы нажмете Ctrl-C.
  4. Использование ОДНО простого редактирования или редактирования в стиле vi не влияет на исходную команду в истории.
2
ответ дан 24 October 2019 в 01:07
поделиться

Что дает

echo $HISTCONTROL
echo $HISTIGNORE

?

Изменить:

Я смог воспроизвести поведение, подобное тому, что вы видели, выполнив следующие действия:

  • В командной строке введите:

    echo abcd
    echo efgh

  • Дважды нажмите стрелку вверх, чтобы отобразилось "echo abcd"

  • Нажмите 1, чтобы добавить этот символ в конец

  • Нажмите escape, чтобы войти в командный режим

  • Дважды нажмите стрелку влево так что курсор находится на «c»

  • Нажмите x, чтобы удалить «c»

  • Нажмите Enter

Теперь, когда вы вернетесь назад по истории, вы увидите новую запись в конце:

echo abd1

и запись, которая раньше имела "echo abcd", теперь будет выглядеть так:

echo abcd1

Это один способ, я уверен, что есть и другие.

1
ответ дан 24 October 2019 в 01:07
поделиться

Если вы вернетесь к какой-либо предыдущей команде и отредактируете ее, но затем НЕ выполняйте ее (вместо этого используйте команды истории, чтобы перейти к другой команде и выполнить это), то правки останутся в вашем списке истории.

Нажатие Ctrl + C после редактирования отменяет это поведение. Он оставляет исходную команду в действии, т. Е. Отменяет запоминание изменений в оригинале.

5
ответ дан 24 October 2019 в 01:07
поделиться