기록에 새 명령을 저장하지 않고 쉘 구성을 재구성하는 키 바인딩을 어떻게 만들 수 있습니까?

기록에 새 명령을 저장하지 않고 쉘 구성을 재구성하는 키 바인딩을 어떻게 만들 수 있습니까?

C-x rreadline 라이브러리 중 하나에 저장된 구성을 다시 로드하기 위해 키 시퀀스를 사용하여 키 바인딩을 만들고 싶습니다 .bash~/.bashrc~/.inputrc

re-read-init-filereadline의 구성을 다시 로드하려면 다음에 설명된 기능을 사용할 수 있다고 생각했습니다 man 3 readline.

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

구성을 다시 로드하려면 또는 명령을 bash사용할 수 있습니다 . 그러나 쉘 명령과 readline 함수를 결합하는 가장 좋은 방법이 무엇인지 잘 모르겠습니다. 그래서 저는 두 가지 키 바인딩 조합을 생각해 냈습니다.source.

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

Bash를 누르면 C-x r다음과 같은 일이 발생합니다.

. ~/.bashrc    `~/.bashrc` is inserted on the command line
C-x C-z 1      `C-x C-z 1` is typed which is bound to `re-read-init-file`
C-m            `C-m` is hit which executes the current command line

~/.inputrctmux 내부에 하나는 편집용 이고 ~/.bashrc다른 하나는 셸용 창이 있고 구성 파일을 변경하면 C-x r셸에 입력한 후 변경 사항(새 별칭 또는 새 키 바인딩)이 다음과 같이 적용되는 것을 볼 수 있기 때문에 작동하는 것 같습니다. 창을 닫지 않고 새 셸을 다시 엽니다.

그러나 동일한 결과를 얻는 더 좋은 방법이 있습니까? 특히 기록에 항목을 남기지 않고 명령을 실행할 수 있습니까? C-p마지막으로 실행된 명령 호출을 클릭하면 을 얻게 되지만 . ~/.bashrc쉘 구성을 다시 가져오기 전에 명령을 실행하는 편이 낫습니다.

나는 같은 문제를 가지고있다 zsh:

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

마찬가지로 을 클릭하면 C-x r명령이 . ~/.zshrc기록에 기록됩니다. 소스를 재구성하는 더 좋은 방법이 있습니까 zsh?

답변1

실행하기 위해 명령줄에 명령을 삽입하지 마세요! 이는 매우 취약합니다. 현재 프롬프트에 아무 것도 입력되지 않았다고 가정하고 있습니다. 대신, line-edit 명령이 아닌 쉘 명령에 키를 바인딩하십시오.

배쉬에서는 다음을 사용하십시오.bind -x.

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

readline 구성도 다시 읽으려면 키 바인딩에서 readline 명령과 bash 명령을 혼합하는 쉬운 방법이 없습니다. 서투른 접근 방식은 두 개의 키 시퀀스를 포함하는 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

답변2

에서 다음과 같이 설명되는 환경 변수를 man bash찾았습니다 .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 \C-x\C-z1\C-m"'
bind '"\C-x\C-z1":  re-read-init-file'

export HISTIGNORE="clear:history:. ~/.bashrc "

마지막 줄은 bash어떤 명령도 저장되지 않도록 해야 하며 clear, history더 중요한 것은 . ~/.bashrc명령입니다.


의 경우 다음과 같이 설명되는 옵션을 zsh찾았습니다 .HIST_IGNORE_SPACEman 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

관련 정보