Редактирование истории в bash - PullRequest
15 голосов
/ 17 марта 2010

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

Ответы [ 4 ]

5 голосов
/ 19 марта 2010

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

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

2 голосов
/ 19 июля 2018

Мне как-то удается повлиять на исходную команду, т. Е. Моя правка заменяет исходную команду в истории.

правый. Если вы вернетесь в свою историю и отредактируете строку без , нажав клавишу возврата для выполнения команды, но вместо этого перейдете к другой записи истории, вы просто отредактировали запись истории. Если вы затем перечислите свою историю, вы увидите * в строке, указывающей, что вы ее отредактировали. Я нахожу эту "особенность" чрезвычайно разочаровывающей. Другие предоставили хорошие примеры того, как это воспроизвести.

Моя цель - избежать этого, поэтому любое изменение предыдущей команды всегда добавляется в историю и никогда не заменяет оригинал.

Я тоже хотел отключить его. Я нашел решение через этот ответ на unix.stackexchange .

Подводя итог, вам нужно включить настройку readline revert-all-at-newline, которая по умолчанию отключена. Если этот параметр включен, bash отменит все изменения, внесенные вами в историю, при выполнении следующей команды.

Чтобы включить этот параметр в вашей оболочке, вы должны добавить следующее в ваш ~/.inputrc файл и затем перезапустить вашу оболочку:

$include /etc/inputrc
set revert-all-at-newline on

Первая строка нужна, потому что я предполагаю, что, если вы введете свой собственный файл .inputrc, файл по умолчанию /etc/inputrc не будет включен, что, вероятно, не то, что вы хотите.

2 голосов
/ 18 марта 2010

Вот мой собственный ответ, пожалуйста, исправьте или предоставьте более подробную информацию, если можете.

Когда в 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 ALONE не влияет на исходную команду в истории.
1 голос
/ 17 марта 2010

Что делают

echo $HISTCONTROL
echo $HISTIGNORE

дать тебе?

Edit:

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

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

    echo abcd
    echo efgh

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

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

  • Нажмите клавишу выхода, чтобы войти в командный режим

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

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

  • Нажмите ввод

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

echo abd1

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

echo abcd1

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...