Каково различие между “историей-w” и действием закрывания сеанса оболочки?

Я сделал некоторые тесты об истории:

  1. Я работал history-c и затем вышел из системы. Эта очищенная история для текущей оболочки.

  2. Я работал history -c && history -w. Это удалило все.

  3. Я удалил все содержание файла истории редактором vi: $vi ~/.bash_history. И затем я вышел из системы. В следующем входе в систему, когда я работал history только строки или команды последней сессии оболочки там.

Это показывает, что существуют различия между history -w и действие, когда мы закрыли сеанс оболочки.

Что действительно происходит, когда мы закрыли сеанс оболочки?

Я думаю history -w содержание памяти перезаписей в файл истории, и history -c удаляет содержание памяти. Это корректно?

6
задан 3 October 2016 в 01:53

1 ответ

При контакте с историей Bash у нас есть два вида:

  1. список предыстории в памяти
  2. .bash_history файл на диске
<час>

, Когда Bash запустится (принятие конфигурации по умолчанию), это загрузит содержание Вашего .bash_history файл в список предыстории в памяти (после усечения его к настроенному размеру, при необходимости).

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

Выход из Вашей сессии Bash регулярно (не сильно уничтожающий его или заставляющий его отказать так или иначе) по умолчанию усекает Ваш список предыстории в памяти для установки настроенному максимальному размеру и затем добавляет только новые записи от текущей сессии Bash (потому что по умолчанию histappend опция включена) в файл истории на диске, не удаляя удаленные записи или повторно добавляя содержание от предыдущих сессий.

<час>

, Когда Вы работаете history -c, Вы очищаете полный список предыстории в памяти, но снова это не влияет на файл истории на диске.

Выполнение history -w записи Ваш текущий список предыстории в памяти в файл истории на диске. Это не добавляет новые записи, но перезаписывает полный файл. Поэтому выполнение history -c && history -w эффективно очищает файл истории также.

<час>

Вручную очистка Ваш файл истории путем редактирования его из рабочей сессии Bash не имеет ожидаемый эффект или постоянно удаление всей истории до сих пор, потому что список предыстории в памяти, которая все еще содержит все старые записи из файла истории, останется неповрежденным.

При выходе из Вашей сессии Bash, файл истории будет переписан с данными из списка предыстории. Однако как по умолчанию histappend опция включена, только новые записи от текущей сессии Bash будут записаны в файл, более старые ретроспективные данные отбрасываются. Необходимо было бы работать history -w для сохранения полного списка предыстории на диск.

<час>

, Что точно происходит, когда оболочка Bash запускается и выходы могут быть считаны в man bash:

HISTORY
       When the -o history option to the set builtin  is  enabled,  the  shell
       provides access to the command history, the list of commands previously
       typed.  The value of the HISTSIZE variable is used  as  the  number  of
       commands to save in a history list.  The text of the last HISTSIZE com‐
       mands (default 500) is saved.  The shell stores  each  command  in  the
       history  list  prior to parameter and variable expansion (see EXPANSION
       above) but after history expansion is performed, subject to the  values
       of the shell variables HISTIGNORE and HISTCONTROL.

       On startup, the history is initialized from the file named by the vari‐
       able HISTFILE (default ~/.bash_history).  The file named by  the  value
       of  HISTFILE  is  truncated,  if necessary, to contain no more than the
       number of lines specified by the value of HISTFILESIZE.   If  HISTFILE‐
       SIZE  is unset, or set to null, a non-numeric value, or a numeric value
       less than zero, the history file is not truncated.   When  the  history
       file  is  read, lines beginning with the history comment character fol‐
       lowed immediately by a digit are interpreted as timestamps for the pre‐
       ceding history line.  These timestamps are optionally displayed depend‐
       ing on the value of the HISTTIMEFORMAT variable.   When  a  shell  with
       history  enabled  exits,  the  last $HISTSIZE lines are copied from the
       history list to $HISTFILE.  If the histappend shell option  is  enabled
       (see  the description of shopt under SHELL BUILTIN COMMANDS below), the
       lines are appended to the history file, otherwise the history  file  is
       overwritten.   If  HISTFILE  is  unset,  or  if  the  history  file  is
       unwritable, the history is not saved.  If the  HISTTIMEFORMAT  variable
       is  set,  time  stamps are written to the history file, marked with the
       history comment character, so they may be preserved across  shell  ses‐
       sions.   This  uses  the history comment character to distinguish time‐
       stamps from other history lines.  After saving the history, the history
       file is truncated to contain no more than HISTFILESIZE lines.  If HIST‐
       FILESIZE is unset, or set to null, a non-numeric value,  or  a  numeric
       value less than zero, the history file is not truncated.
9
ответ дан 23 November 2019 в 07:33

Другие вопросы по тегам:

Похожие вопросы: