Как выполнить команду, не сохраняя ее в истории (даже для клавиши «вверх») в zsh

Люди упомянули, используя preexec hook в zsh, но как именно я должен использовать его? Я имею в виду, хорошо, я могу проверить для каждой команды, действительно ли это команда, которую я не хочу отображать в истории, но что делать после этого?

  • Почему высокие коды выхода на Linux-оболочках (> = 256) работают не так, как ожидалось?
  • Что такое sourcing мой сценарий оболочки?
  • Zsh preexec - Как обрезать все ведущие отступы от кодового блока?
  • Стандартный / канонический способ проверить, выводит ли предыдущий трубопровод выпуск?
  • тема oh-my-zsh, похоже, не обновляется, если я не запустил zsh
  • Как исправить вкладку, чтобы она не скрывала записи?
  • Команда переназначена
  • Как я могу выполнить вкладку umount, ограничивая тома в определенном каталоге?
  • 2 Solutions collect form web for “Как выполнить команду, не сохраняя ее в истории (даже для клавиши «вверх») в zsh”

    По умолчанию zsh всегда сохраняет последнюю команду в истории сеанса, даже если HISTSIZE=0 . Вы можете написать свой собственный виджет, чтобы обойти механизм истории.

     sneaky-run () { echo eval $BUFFER BUFFER='' zle reset-prompt } zle -N sneaky-run bindkey '^X^M' sneaky-run 

    Этот виджет sneaky-run запустит введенную в настоящее время команду, затем пуст буфер команд и сбросит приглашение. Команды, которые запускаются внутри виджета, не добавляются в историю.

    echo в начале необходимо, чтобы выход начинался в новой строке. Если у вас многострочное приглашение, вам может потребоваться добавить дополнительные echo сигналы для каждой дополнительной строки непосредственно перед zle reset-prompt , в противном случае приглашение может перезаписать несколько строк вывода команды.

    Для этого примера sneaky-run привязан к комбинации клавиш Ctrl + X , Enter .


    Если вы не хотите использовать дополнительную комбинацию клавиш для этого, вы также можете обернуть виджет accept-line приемник, который обычно привязан к Enter

     accept-line-with-sneaky () { if [[ "$BUFFER" == "${BUFFER#" } ]] ; then zle accept-line else echo eval $BUFFER BUFFER='' zle reset-prompt fi } zle -N accept-line-with-sneaky bindkey '^M' accept-line-with-sneaky 

    Это подражает поведению установки HIST_IGNORE_SPACE : если команда начинается с пробела, она не будет добавлена ​​в историю. Но кроме HIST_IGNORE_SPACE он также не будет доступен при нажатии кнопки Up .

    Примечание: это переопределит одно из самых основных привязок клавиш zsh . Поэтому, пожалуйста, тщательно ~/.zshrc перед тем, как поместить это в свой файл ~/.zshrc .

    Вы должны использовать опцию HIST_IGNORE_SPACE .

     setopt HIST_IGNORE_SPACE 

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

    Linux и Unix - лучшая ОС в мире.