Половина истории 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