Что может заставить объект быть удаленным из моей истории удара?

Файловая система по имени F2FS включена в Linux с тех пор 3.8 и была специально предназначена для характеристик твердотельных дисков. Существует несколько других оптимизированных SSD файловых систем, если Вы хотите исследовать проблему далее.

5
12.04.2015, 01:04
1 ответ

Я думаю, что причина такого поведения заключается в том, как Бэш управляет модификацией предыдущих строк истории. Такие команды, как previous-history (C-p) или reverse-search-история (C-r) делают извлечение предыдущих записей истории:

previous-history (C-p)
       Fetch the previous command from the history list, moving back in the list.

Когда предыдущая запись истории извлекается, она печатается так же, как если бы была набрана. Теперь вы можете просто изменить его, но не выполнять (как в вашем примере) или изменить и выполнить. При ее выполнении вы вызываете accept line:

accept-line (Newline or Return)

    Accept the line regardless of where the cursor is. If this line is
    non-empty, add it to the history list according to the setting of
    the HISTCONTROL and HISTIGNORE variables. If this line is a
    modified history line, then restore the history line to its
    original state.

После нажатия Return измененная строка будет сохранена в истории, а исходная оставлена нетронутой. Но давайте подумаем, что произойдет, если вы просто модифицируете извлеченную строку, не нажимая Return - она модифицируется, но не выполняется, поэтому accept-line не вызывается. Происходит то, что исходная строка истории становится измененной.

Чтобы увидеть это на практике, добавьте эту строку в ваш ~/.inputrc и запустите новую подоболочку:

set mark-modified-lines On

Теперь сделаем то же самое, что и в вашем примере:

$ echo April # 0) press Return - `accept-line` is called

# 1. press C-r and type `April' and Tab - you will see this again because
#    `echo April' is in history:

$ echo April

# 2. now kill this line using C-k or C-u. C-r `April' doesn't work anymore
#    because there is no `echo April' in the history
# 3. DON'T PRESS RETURN HERE! Press Up arrow first a couple of times and
#    press Return to invoke a different command, it can be anything you had
#    in your history but just no Return here
# 4. now, see `history', somewhere there you will see the empty string. It
#    may look a bit different depending on your HISTTIMEFORMAT but note
#    there is an asterisk next to the history line number and a command is
#    missing. It's missing because it has been modified and saved in 2).

$ history
(...)
  483* 2015-04-12 02:36:19

Как вы заметили во 2-м комментарии к вашему вопросу, если бы вы нажали кнопку Return во 2), вы бы не изменили исходную команду, введенную в точке 0), а могли бы вызвать ее с помощью C-r.

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

9
27.01.2020, 20:35

Теги

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