Если я бегу history
, я вижу свои последние выполненные команды.
Но если я делаю tail -f $HISTFILE
или tail -f ~/.bash_history
, они не попадают в список.
Файл заблокирован, есть временное местоположение или что-то подобное?
Если я бегу history
, я вижу свои последние выполненные команды.
Но если я делаю tail -f $HISTFILE
или tail -f ~/.bash_history
, они не попадают в список.
Файл заблокирован, есть временное местоположение или что-то подобное?
Ответы:
Bash поддерживает список команд внутри памяти, пока он работает. Они записаны .bash_history
на выходе :
При выходе из интерактивной оболочки последние строки $ HISTSIZE копируются из списка истории в файл с именем $ HISTFILE.
Если вы хотите принудительно записать историю команд, вы можете использовать history -a
команду, которая будет:
Добавьте новые строки истории (строки истории, введенные с начала текущего сеанса Bash) в файл истории.
Также есть -w
опция:
Запишите текущую историю в файл истории.
который может подойти вам больше в зависимости от того, как именно вы используете свою историю.
Если вы хотите убедиться, что они всегда пишутся немедленно, вы можете поместить эту команду в вашу PROMPT_COMMAND
переменную:
export PROMPT_COMMAND='history -a'
(Не ответ, но я не могу добавлять комментарии)
Если вы проверяете, .bash_history
потому что вы просто хотите удалить определенную команду (например, содержащую пароль в открытом виде), вы можете напрямую удалить запись в памяти с помощью history -d <entry_id>
.
Например, предположим, что вывод:
$ history
926 ll
927 cd ..
928 export --password=super_secret
929 ll
и вы хотите очистить export
линию, вы можете просто достичь этого путем:
history -d 928
bash сохраняет его в рабочей памяти, bash можно настроить так, чтобы он сохранялся при закрытии bash или после каждой команды, а также загружался при запуске bash или по запросу.
Если вы сконфигурируете сохранение после каждой команды, то учтите последствия одновременного запуска нескольких команд bash. (командные строки будут чередоваться)
bash
исполняемом файле. Я хотел бы написать «Он хранится bash
в памяти, ...»
Команды сохраняются в памяти (RAM), пока ваш сеанс активен. Как только вы закрываете оболочку, список команд записывается .bash_history
перед выключением.
Таким образом, вы не увидите историю текущего сеанса в .bash_history
.
bash
завершения, что не подразумевает перезагрузку (особенно в графических средах, где вы можете открывать и закрывать терминалы по своему желанию).
Во время работы история сохраняется только в памяти (по умолчанию), если:
H
in in echo "$-"
) установлен.0
и*
(или какой-то другой очень строгий шаблон).Если что-то из вышеперечисленного дает сбой, история не сохраняется в памяти и, следовательно, история не может или не будет записана на диск.
История в памяти записывается на диск, если:
Но только при выходе из оболочки или при выполнении команд 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
.bash_history
файл случайно становится владельцем root, все перестает работать. В этом случае проверьте владение и используйтеsudo
для исправления владения, если это необходимо.