Половина истории bash отсутствует

Однажды вечером я читал вопросы и ответы AU и использовал команду bash:

inxi -????

Проблема сегодня в том, что я не помню персонажей, составляющих????. Я хочу поместить команду и параметры в мою электронную таблицу документации. Основываясь на этом ответе ( Как вызвать историю в терминале), я использовал эту команду:

$ cat .bash_history | grep inxi
inxi -b
sudo apt install inxi
inxi -b

Однако команды, которую я хочу, нет, хотя история уходит очень далеко. Я использовал inxi Команды много раз в терминале с той старой истории, но ни одна из них не появляется.

Я также попробовал Ctrl+R+inxi без удачи. Поскольку я все время открываю несколько окон терминала, история привязана к конкретному окну?

Есть ли другой способ grep файлы истории bash?

Обратите внимание, что я не ставлю перед терминальными командами пробел, чтобы они не отображались в истории.

2 ответа

Решение

Я не могу знать, что произошло без доступа к вашей машине, но вот краткое объяснение того, как работает система истории, которая может помочь вам выяснить, что произошло.

Каждый открытый терминал имеет свой собственный буфер истории. Эти буферы добавляются к вашему $HISTFILE когда терминал закрыт (возможно, также всякий раз, когда буфер заполнен, но я не знаю, как часто это происходит). Теперь способ поиска команды в вашей истории - просто запустить:

history | grep command

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

Если это по-прежнему не помогает, вы, вероятно, перешли порог команд, хранящихся в $HISTFILE, Поведение $HISTFILE контролируется различными переменными среды (см. man bash для полного списка), но соответствующие здесь:

   HISTSIZE
          The  number  of commands to remember in the command history (see HISTORY below).  If the value is 0, commands are not saved in the history list.  Numeric values less than
          zero result in every command being saved on the history list (there is no limit).  The shell sets the default value to 500 after reading any startup files.

   HISTFILESIZE
          The maximum number of lines contained in the history file.  When this variable is assigned a value, the history file is truncated, if necessary, to contain no  more  than
          that number of lines by removing the oldest entries.  The history file is also truncated to this size after writing it when a shell exits.  If the value is 0, the history
          file is truncated to zero size.  Non-numeric values and numeric values less than zero inhibit truncation.  The shell sets the default value to the value of HISTSIZE after
          reading any startup files.

Чем выше эти значения, тем больше команд вы сохраните в своем $HISTFILE, Например, я использую:

HISTSIZE=999999
HISTFILESIZE=999999

Если вы хотите импортировать историю из одной оболочки в другую, вы можете использовать history команда:

$ help history | grep -E -- '-a|-r'
      -a    append history lines from this session to the history file
      -r    read the history file and append the contents to the history

Итак, беги history -a написать историю с одного терминала, а затем history -w читать это из другого. Сейчас работает history покажет вам историю обоих снарядов.

Наконец, вы можете сделать так, чтобы все ваши терминалы имели одинаковую историю, добавив эти строки в ваш ~/.bashrc:

## history -a causes the last command to be written to the
## history file automatically and history -r imports the history
export PROMPT_COMMAND='history -a;history -r'

Я также предлагаю вам добавить это:

## Make Bash append rather than overwrite the history on disk:
shopt -s histappend

Ваша команда работала на меня...

$ cat .bash_history | grep inxi
inxi -b
sudo apt install inxi
inxi -b
inxi -Fxz -c 0 > inxi_list.txt
inxi -Fxz
inxi -Fxz
sudo inxi -Fxz

Я также периодически копирую историю в файл и сохраняю ее.

history > history_$(date '+%Y-%m-%d_%H:%M:%S')_$(hostname).txt
Другие вопросы по тегам