Где хранится история bash?

95

Если я бегу history, я вижу свои последние выполненные команды.

Но если я делаю tail -f $HISTFILEили tail -f ~/.bash_history, они не попадают в список.

Файл заблокирован, есть временное местоположение или что-то подобное?

Adionditsak
источник

Ответы:

117

Bash поддерживает список команд внутри памяти, пока он работает. Они записаны .bash_historyна выходе :

При выходе из интерактивной оболочки последние строки $ HISTSIZE копируются из списка истории в файл с именем $ HISTFILE.

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

Добавьте новые строки истории (строки истории, введенные с начала текущего сеанса Bash) в файл истории.

Также есть -wопция:

Запишите текущую историю в файл истории.

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

Если вы хотите убедиться, что они всегда пишутся немедленно, вы можете поместить эту команду в вашу PROMPT_COMMANDпеременную:

export PROMPT_COMMAND='history -a'
Майкл Гомер
источник
Примечание: если ваш .bash_historyфайл случайно становится владельцем root, все перестает работать. В этом случае проверьте владение и используйте sudoдля исправления владения, если это необходимо.
Торек
13

(Не ответ, но я не могу добавлять комментарии)

Если вы проверяете, .bash_historyпотому что вы просто хотите удалить определенную команду (например, содержащую пароль в открытом виде), вы можете напрямую удалить запись в памяти с помощью history -d <entry_id>.

Например, предположим, что вывод:

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

и вы хотите очистить exportлинию, вы можете просто достичь этого путем:

history -d 928
Эдди С.
источник
11

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

Если вы сконфигурируете сохранение после каждой команды, то учтите последствия одновременного запуска нескольких команд bash. (командные строки будут чередоваться)

Ctrl-Alt-Делор
источник
2
В начале вашего ответа звучит так, как будто история хранится в файле bash или даже в bashисполняемом файле. Я хотел бы написать «Он хранится bashв памяти, ...»
Anthon
это действительно лучше
Anthon
5

Команды сохраняются в памяти (RAM), пока ваш сеанс активен. Как только вы закрываете оболочку, список команд записывается .bash_historyперед выключением.

Таким образом, вы не увидите историю текущего сеанса в .bash_history.

Джейсо
источник
4
Файл истории обновляется после bashзавершения, что не подразумевает перезагрузку (особенно в графических средах, где вы можете открывать и закрывать терминалы по своему желанию).
Джон У. С. Смит
4

Во время работы история сохраняется только в памяти (по умолчанию), если:

  • set -o history ( Hin in echo "$-") установлен.
  • HISTSIZE нет 0 и
  • HISTIGNORE нет *(или какой-то другой очень строгий шаблон).

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

История в памяти записывается на диск, если:

  • HISTFILESIZE не 0 и
  • HISTFILE не является неопределенным.

Но только при выходе из оболочки или при выполнении команд history -a(добавление) или history -w(запись).

Для запуска немедленной записи на диск вы можете использовать переменную:

 PROMPT_COMMAND='history -a'

которые Воля appendв newистории строки в файл история. Это строки истории, введенные с начала текущей сессии bash, но еще не добавленные в файл истории.

Или же:

 PROMPT_COMMAND='history -w'

Для того, чтобы переписать историю в HISTFILE со списком из памяти.

Итак, вы можете удалить команду из истории в памяти:

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

И запишите его на диск с помощью последней команды:

 history -w    # with `shopt -u histappend` unset
Исаак
источник
Будет ли что-то не так, если положить это в работу cron? Я подозреваю, что многие пользователи с гораздо меньшим количеством имен пользователей входят в систему на определенном сервере, и при этом история довольно мала, и это старый сервер, но, возможно, некоторые сессии никогда не закрываются ...
oneindelijk