C-x r
readline 라이브러리 중 하나에 저장된 구성을 다시 로드하기 위해 키 시퀀스를 사용하여 키 바인딩을 만들고 싶습니다 .bash
~/.bashrc
~/.inputrc
re-read-init-file
readline의 구성을 다시 로드하려면 다음에 설명된 기능을 사용할 수 있다고 생각했습니다 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
~/.inputrc
tmux 내부에 하나는 편집용 이고 ~/.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_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