如何创建一个重新配置 shell 配置的键绑定,而不将新命令保存在历史记录中?

use*_*381 3 bash zsh configuration

我想使用键序列创建一个键绑定,以重新加载存储在 中C-x r的配置以及存储在 中的 readline 库之一。bash~/.bashrc~/.inputrc

要重新加载 readline 的配置,我想我可以使用re-read-init-file以下中描述的函数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.
Run Code Online (Sandbox Code Playgroud)

要重新加载 的配置bash,我可以使用sourceor.命令。但是,我不确定将 shell 命令与 readline 函数结合起来的最佳方法是什么。因此,我想出了 2 个键绑定的组合:

bind '"\C-xr":      ". ~/.bashrc \C-x\C-z1\C-m"'
bind '"\C-x\C-z1":  re-read-init-file'
Run Code Online (Sandbox Code Playgroud)

当我点击C-x rbash 时,会发生以下情况:

. ~/.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
Run Code Online (Sandbox Code Playgroud)

它似乎有效,因为在 tmux 内部,如果我有 2 个窗格,一个用于编辑~/.inputrc~/.bashrc,另一个用于 shell,并且我更改配置文件,在敲入C-x rshell 后,我可以看到更改生效(无论是新别名或新键绑定),无需关闭窗格即可重新打开新 shell。

但是,有没有更好的方法来达到相同的结果呢?特别是,是否可以执行命令而不在历史记录中留下条目?因为如果我点击C-p回忆最后执行的命令,我会得到. ~/.bashrc,而我更愿意直接获取在重新获取 shell 配置之前执行的命令。

我有同样的问题zsh

bindkey -s '^Xr' '. ~/.zshrc^M'
Run Code Online (Sandbox Code Playgroud)

同样,点击 后C-x r,该命令. ~/.zshrc将记录在历史记录中。有没有更好的方法来重新配置 的源zsh

Gil*_*il' 5

不要将命令插入命令行来运行它!这是非常脆弱的\xe2\x80\x94\xc2\xa0你正在尝试的假设在当前提示符下还没有输入任何内容。相反,请将密钥绑定到 shell 命令,而不是将其绑定到行编辑命令。

\n\n

在 bash 中,使用bind -x.

\n\n
bind -x \'"\\C-xr": . ~/.bashrc\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您还想重新读取 readline 配置,则没有一种简单的方法可以在键绑定中混合 readline 命令和 bash 命令。一种笨拙的方法是将键绑定到包含两个键序列的 readline 宏,一个绑定到要执行的 readline 命令,一个绑定到 bash 命令。

\n\n
bind \'"\\e[99i~": re-read-init-file\'\nbind -x \'"\\e[99b~": . ~/.bashrc\'\nbind \'"\\C-xr": "\\e[99i~\\e[99b~"\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 zsh 中,使用zle -N将函数声明为小部件,然后bindkey将该小部件绑定到键。

\n\n
reread_zshrc () {\n  . ~/.zshrc\n}\nzle -N reread_zshrc\nbindkey \'^Xr\' reread_zshrc\n
Run Code Online (Sandbox Code Playgroud)\n