Как создать привязку ключей для повторного поиска конфигурации оболочки без сохранения новой команды в истории?

Я хотел бы создать привязку ключа, используя последовательность ключей Cx r , чтобы перезагрузить конфигурацию bash , сохраненную в ~/.bashrc , и одну из библиотеки readline, хранящуюся в ~/.inputrc .

Чтобы перезагрузить конфигурацию readline, я думаю, что я мог бы использовать функцию re-read-init-file которая описана в man 3 readline :

 re-read-init-file (Cx Cr) Read in the contents of the inputrc file, and incorporate any bindings or variable assignments found there. 

Чтобы перезагрузить конфигурацию bash , я мог бы использовать source или . команда. Однако я не уверен, что лучший способ объединить команду оболочки с функцией readline. Итак, я придумал комбинацию из двух ключевых привязок:

 bind '"\C-xr": ". ~/.bashrc \Cx\C-z1\Cm"' bind '"\Cx\C-z1": re-read-init-file' 

Когда я ударил Cx r в bash, вот что происходит:

 . ~/.bashrc `~/.bashrc` is inserted on the command line Cx Cz 1 `Cx Cz 1` is typed which is bound to `re-read-init-file` Cm `Cm` is hit which executes the current command line 

Кажется, это работает, потому что внутри tmux, если у меня есть 2 панели, один для редактирования ~/.inputrc или ~/.bashrc , другой с оболочкой, и я меняю конфигурационный файл, после попадания Cx r в оболочку, я может видеть, что изменение вступает в силу (будь то новый псевдоним или новое связывание ключей), без необходимости закрывать панель для повторного открытия новой оболочки.

Но есть ли лучший способ добиться того же результата? В частности, можно ли выполнять команды без оставления записи в истории? Потому что, если я нажму Cp чтобы вспомнить последнюю выполненную команду, я получаю . ~/.bashrc . ~/.bashrc , в то время как я предпочел бы напрямую получить команду, которая была выполнена до того, как я снова переработаю конфигурацию оболочки.

У меня такая же проблема с zsh :

 bindkey -s '^Xr' '. ~/.zshrc^M' 

Опять же, после удара Cx r , команда . ~/.zshrc . ~/.zshrc зарегистрирован в истории. Есть ли лучший способ переустановить конфигурацию zsh ?

  • перенаправление ввода-вывода zsh: перенаправление и последующее соединение; что происходит?
  • Как я могу вывести «временно» в оболочку, как это делает завершение вкладки zsh?
  • Трубопроводы, рабочие места и процессы в Zsh
  • Как извлечь только «базовое имя» родительского каталога в оболочке?
  • Как функция может вызвать функцию, которую она «переопределяет»?
  • zsh ждать выполнения заданий
  • ZSH: разбиение первых N файлов по пути в лексикографическом порядке
  • Как отключить «auto cd» в zsh с помощью oh-my-zsh
  • 2 Solutions collect form web for “Как создать привязку ключей для повторного поиска конфигурации оболочки без сохранения новой команды в истории?”

    Не вводите команду в командную строку для ее запуска! Это очень хрупкое – то, что вы пытаетесь, предполагает, что в текущем приглашении пока ничего не напечатано. Вместо этого привяжите ключ к команде оболочки, а не привяжите ее к команде строки.

    В bash используйте bind -x .

     bind -x '"\C-xr": . ~/.bashrc' 

    Если вы также хотите перечитать конфигурацию readline, нет никакого нечеткого способа смешивания команд readline и команд bash в привязке клавиш. Kludgy путь заключается в том, чтобы связать ключ с макросом readline, который содержит две последовательности клавиш, одну связанную с командой readline, которую вы хотите выполнить, и одну связанную с командой bash.

     bind '"\e[99i~": re-read-init-file' bind -x '"\e[99b~": . ~/.bashrc' bind '"\C-xr": "\e[99i~\e[99b~"' 

    В zsh используйте zle -N для объявления функции как виджета, а затем bindkey для привязки этого виджета к ключу.

     reread_zshrc () { . ~/.zshrc } zle -N reread_zshrc bindkey '^Xr' reread_zshrc 

    В man bash я нашел HISTIGNORE среды HISTIGNORE , описание которой такова:

     HISTIGNORE A colon-separated list of patterns used to decide which command lines should be saved on the history list. Each pattern is anchored at the beginning of the line and must match the complete line (no implicit `*' is appended). Each pattern is tested against the line after the checks specified by HISTCONTROL are applied. In addition to the normal shell pattern matching characters, `&' matches the previous history line. `&' may be escaped using a backslash; the backslash is removed before attempting a match. The second and subsequent lines of a multi-line compound command are not tested, and are added to the history regardless of the value of HISTIGNORE. 

    Итак, я экспортировал следующее значение в ~/.bashrc :

     bind '"\C-xr": ". ~/.bashrc \Cx\C-z1\Cm"' bind '"\Cx\C-z1": re-read-init-file' export HISTIGNORE="clear:history:. ~/.bashrc " 

    Последняя строка должна препятствовать тому, чтобы bash сохранял clear , history и, что еще важнее . ~/.bashrc . ~/.bashrc .


    Для zsh я нашел параметр HIST_IGNORE_SPACE , который описан в man zshoptions :

     HIST_IGNORE_SPACE (-g) Remove command lines from the history list when the first character on the line is a space, or when one of the expanded aliases contains a leading space. Only normal aliases (not global or suffix aliases) have this behaviour. Note that the command lingers in the internal history until the next command is entered before it vanishes, allowing you to briefly reuse or edit the line. If you want to make it vanish right away without entering another command, type a space and press return. 

    Согласно тому, что он говорит, если этот параметр включен, zsh должен удалить из истории любую команду, начинающуюся с пробела. Тем не менее, он временно остается во внутренней истории, пока не будет выполнена следующая команда. Итак, я установил эту опцию в ~/.zshrc , а затем переопределил привязку клавиш, чтобы повторно настроить конфигурацию оболочки следующим образом:

      setopt HIST_IGNORE_SPACE bindkey -s '^Xr' ' . ~/.zshrc^M ^M' # │ │ # │ └─ command containing only a space to force `zsh` # │ to “forget“ the previous command immediately # └─ space added to prevent `zsh` from logging the command 
    Linux и Unix - лучшая ОС в мире.