Сохраните только успешные команды в истории Bash

Можно получить доступ к удаленному использованию файлов fish:// или sftp:// с каждым приложением KDE. Например, можно соединиться с удаленным хостом с помощью файловых менеджеров как дельфин или Konqueror и после того каждого файла, который Вы нажимаете, будет открыто (в приложении KDE) как он, был файл на Вашем локальном диске. Архивы будут открыты в Ковчеге (KDE архивируют менеджер). И конечно можно открыть архивы непосредственно в Ковчеге (File -> Open -> sftp://remotehost/path/to/file)...

Другой альтернативой, которую я знаю, что она работает, является Emacs... ;) Но перед попыткой его, необходимо посмотреть на кривую обучения Emacs... ;)

21
07.11.2013, 11:50
3 ответа

Я не думаю, что Вы действительно хотите это. Мой обычный рабочий процесс идет как это:

  • Введите команду
  • Выполните его
  • Заметьте его сбой
  • Нажмите клавишу UP
  • Отредактируйте команду
  • Выполните его снова

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

20
27.01.2020, 19:43
  • 1
    я предполагаю лучший дизайн, был бы историей сессии и постоянной историей.Спасибо! –  Adam Matan 05.07.2012, 08:22
  • 2
    сохраняется при выходе из терминала. Таким образом, в то время как можно вернуться к командам, Вы ввели на этом терминальном сеансе, он на самом деле сохраняется к истории удара при выходе из терминала. –  To Do 07.02.2016, 23:32

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

$ grep non_existent_string from_file_that_exists
$ echo $?
1
11
27.01.2020, 19:43

Хорошо иметь последний неверный комментарий, чтобы исправить его, но вскоре после этого он становится потенциально запутанным мусором.

Мой подход состоит из двух этапов: сохраняю команды, которые не работают, когда они срабатывают, и удаляю их позже.

Сохранение команд, которые не выполняются, когда они выполняются:

error_handler() {
    FAILED_COMMANDS="$(history | tail -1l | cut -c -5) $FAILED_COMMANDS"
}

trap error_handler ERR

trap command signal выполняет команду , когда один из сигналов «поднят».

$ (команда) , выполняет команду и фиксирует ее вывод.

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

Просто, но неправильно работает с HISTCONTROL и HISTIGNORE - когда команда не сохраняется в истории из-за одной из переменных, номер истории последней сохраненной в истории команды - предыдущая команда; Таким образом, если неправильная команда не сохраняется в истории, предыдущая команда будет удалена.

Немного более сложная версия, которая в этом случае работает правильно:

debug_handler() {
    LAST_COMMAND=$BASH_COMMAND;
}

error_handler() {
    local LAST_HISTORY_ENTRY=$(history | tail -1l)

    # if last command is in history (HISTCONTROL, HISTIGNORE)...
    if [ "$LAST_COMMAND" == "$(cut -d ' ' -f 2- <<< $LAST_HISTORY_ENTRY)" ]
    then
        # ...prepend it's history number into FAILED_COMMANDS,
        # marking the command for deletion.
        FAILED_COMMANDS="$(cut -d ' ' -f 1 <<< $LAST_HISTORY_ENTRY) $FAILED_COMMANDS"
    fi
}

trap error_handler ERR
trap debug_handler DEBUG

Удалить сохраненные команды позже:

exit_handler() {
    for i in $(echo $FAILED_COMMANDS | tr ' ' '\n' | uniq)
    do
        history -d $i
    done
    FAILED_COMMANDS=
}

trap exit_handler EXIT

Объяснение:

При выходе из Bash для каждого уникального номера истории удалите соответствующую запись в истории,
{ {1}} затем удалите FAILED_COMMANDS , чтобы не удалять команды, унаследовавшие номера истории от уже удаленных команд.

Если вы уверены, что FAILED_COMMANDS не будет содержать дубликатов, вы можете просто перебрать его
(т. Е. Написать для i в $ FAILED_COMMANDS ). Однако, если вы ожидаете, что он не будет отсортирован от наибольшего к наименьшему (в данном случае это всегда так), замените uniq на sort -rnu .

Номера истории в FAILED_COMMANDS должны быть уникальными и отсортированными от наибольшего к наименьшему, потому что при удалении записи номера следующих команд сдвигаются, т. Е. когда вы вводите history -d 2 , 3-я запись становится 2-й, 4-я становится 3-й и т. д.

Из-за этого при использовании этого кода нельзя вручную вызвать history -d
, где n меньше или равно наибольшему числу, хранящемуся в FAILED_COMMANDS
и ожидайте, что код будет работать правильно.

Вероятно, неплохо было бы подключить exit_handler к EXIT , но вы также можете вызвать его в любое время раньше.

4
27.01.2020, 19:43

Теги

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