Не сохранять неудавшуюся команду в истории?

Вопрос или проблема

Я использую следующий фрагмент кода, чтобы исключить все неудачные команды (код возврата 1) из сохранения в историю zsh:

 zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }

Но если команда это алиас lsl (алиас lsl=”ls -l”), неудачная команда все равно будет добавлена в историю zsh:

lsl whatever_folder_doesnt_exist

whatever_folder_doesnt_exist не существует, и я наблюдаю lsl whatever_folder_doesnt_exist все еще в истории zsh.

Здесь я хочу исключить все команды, у которых код возврата не 0, как я могу это сделать?

Вы можете использовать плагин zsh-hist, чтобы настроить хук precmd, который удаляет последний элемент из истории, если он имел ненулевой код выхода:

source path/to/zsh-hist.plugin.zsh
delete-failed-history() {
  (( ? )) && 
    hist -s d -1
}
autoload -Uz add-zsh-hook
add-zsh-hook precmd delete-failed-history

Если вы хотите, чтобы удалялись только команды, имеющие код выхода 1, измените (( ? )) на (( ? == 1 )).

Марлон, ваш вклад невероятно полезен. Однако есть недостаток: когда вы используете Ctrl+C для остановки команды, она удаляется из файла истории, потому что её код выхода 130. Также есть другие коды выхода, которые я хотел бы сохранить в своей истории. Чтобы решить это, я реализовал метод с использованием case.

source ${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-hist/zsh-hist.plugin.zsh
delete-failed-history() {
    case $? in
    0|130|137)
      ;; # Ничего не делаем для разрешенных кодов
    *)
      hist -s d -1
      ;;
  esac
}
autoload -Uz add-zsh-hook
add-zsh-hook precmd delete-failed-history

Чтобы установить zsh-hist, выполните:

git clone https://github.com/marlonrichert/zsh-hist.git ${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-hist

Ответ или решение

Если вы хотите исключить из истории команд оболочки Zsh все команды, которые завершились с ненулевым кодом возврата, то, судя по вашему описанию, ваше текущее решение с использованием функции zshaddhistory не вполне эффективно. Давайте рассмотрим, как вы можете усовершенствовать этот процесс.

Теория

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

Обратные коды возврата

В Unix-подобных системах программы возвращают коды, чтобы сообщить о своем статусе завершения. Код возврата 0 обычно указывает на успешное завершение, в то время как ненулевые коды сигнализируют об ошибках. Пример: если вы вводите команду для доступа к несуществующей папке (например, lsl whatever_folder_doesnt_exist), то команда завершится с ненулевым кодом возврата.

Пример

Вы использовали функцию zshaddhistory:

zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }

Этот код не исключает из истории команды, которые возвращают ненулевые коды возврата, особенно если команда является алиасом.

Применение

Наилучшим подходом может быть использование плагина zsh-hist, который позволяет более гибко управлять историей команд. Этот плагин предоставляет механизм установки крючков, таких как precmd, что позволяет запускать функции до выполнения приглашения командной строки.

Установка плагина

Сначала установим плагин zsh-hist:

git clone https://github.com/marlonrichert/zsh-hist.git ${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-hist

Конфигурация hooks

Создаем функцию, которая будет удалять неудачные команды:

source ${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-hist/zsh-hist.plugin.zsh
delete-failed-history() {
    case $? in
    0|130|137)
      ;; # Ничего не делать для разрешенных кодов
    *)
      hist -s d -1
      ;;
  esac
}
autoload -Uz add-zsh-hook
add-zsh-hook precmd delete-failed-history

В этом примере функция delete-failed-history проверяет код завершения последней выполненной команды. Если код возврата не соответствует одному из предопределенных (например, 0, 130, 137, что может быть связано с пользовательским прерыванием с помощью Ctrl+C), она удаляет последнюю команду из истории, используя команду hist -s d -1.

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...