Как остановить bash, редактируя историю, когда я повторно использую и изменяю запись?

20

Некоторые случаи bash изменяют историю команд при повторном использовании и редактировании предыдущей команды, другие, по-видимому, этого не делают. Я искал и искал, но не могу найти ничего, что говорит о том, как предотвратить изменение команд в истории, когда они повторно используются и редактируются.

Есть вопросы, подобные этому , но, похоже, это говорит о том, как справиться с редактируемой историей. Я только недавно столкнулся с экземпляром bash, который редактирует историю при повторном использовании команды - все предыдущие оболочки bash, которые я использовал (насколько я заметил), были настроены так, чтобы не изменять историю при повторном использовании и отредактируйте команду. (Возможно, я просто не уделял должного внимания своей истории раковины в течение последних 15 лет или около того ...)

Так что это, пожалуй, лучший вопрос: могу ли я сказать bash НИКОГДА не изменять историю - и если да, то как?

Ричард Уайзман
источник
Вы можете использовать history -pдля расширения истории, не затрагивая файл истории. Вы можете сделать history -sто же самое и добавить в историю без исполнения. Вы можете сделать, HISTIGNORE='start of a command I never want in history.*:command2.*'чтобы сохранить некоторые команды из истории.
mikeserv
1
Разве set revert-all-at-newline onв вопросе, который вы связываете, не решить вашу проблему? Можете показать как воспроизвести проблему? Обратите внимание, что вы также можете использовать zshдля поведения более в соответствии с тем, что вы хотите.
Стефан Шазелас
@mikeserv Глядя на справочную страницу, history -pнужно ли что-то делать для каждой команды, которую я хочу использовать повторно - это правильно? Если так, то это не совсем то, что я ищу. Как я уже упоминал, я использовал экземпляры bash, которые никогда не изменяют историю, когда команда повторно используется и редактируется.
Ричард Уайзман
@ StéphaneChazelas Нет, я не думаю, что revert-all-at-newlineэто то, что мне нужно. Если я отредактирую команду и нажму CTRL-C, чтобы отменить ее, я также не хочу, чтобы это влияло на историю. Раньше мне никогда не приходилось настраивать bash, чтобы не изменять историю, что является одной из причин, по которой я запутался в том, почему иногда новая установка ведет себя так, а иногда - в другом. Кстати, в экземпляре, который не редактирует историю при повторном использовании команды, a bind -V | grep revertуказывает, что revert-all-at-newlineустановлено значение «off».
Ричард Уайзман,
2
На самом деле это имеет мало общего с bash. Это все о readline. Существуют различные реализации readlineбиблиотеки, и она также имеет свой собственный набор настроек (их много) и собственный файл конфигурации. Я не уверен точно, является ли это настройкой или просто различием реализации, но вы должны искать в документации по readline, а не в bash.
Орион

Ответы:

9

Оказывается, revert-all-at-newlineэто ответ. Мне нужно было включить set revert-all-at-newline onв мой ~/.inputrcфайл, так как использование setкоманды в приглашении bash не имело никакого эффекта. (Тогда, конечно, мне пришлось запустить новую оболочку.)

Кроме того, я обнаружил, что ~/.inputrcзагружается вместо, /etc/inputrc если присутствует, что означает, что любые значения по умолчанию, определенные в последнем, больше не активны при создании ~/.inputrc. Чтобы это исправить, начните ~/.inputrcс $include /etc/inputrc.

Спасибо @ StéphaneChazelas за указание в правильном направлении.

Ричард Уайзман
источник
0

В ~ / .bashrc вы можете добавить

shopt -s histappend
Джефф Коулман
источник
Спасибо, но это не влияет на проблему, с которой я сталкиваюсь. Я только что проверил и histappendвключен, но моя история все еще показывает изменения предыдущих команд.
Ричард Уайзман
Я искал страницу справки bash и нашел правила для истории редактирования. Имена команд Readline. Это довольно наглядно, но я не вижу опции для того, что вы хотите, за исключением возможно: redraw-current-line Обновить текущую строку линия.
Джефф Коулман
Существует также опция «вернуть все при новой строке», которая по умолчанию отключена
Джефф Коулман