私が使用するbash
バージョン4.3.48
:
$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
C-x r
設定を再ロードするために、キーシーケンスを使用してキーバインディングを定義しようとしていますbash + readline
。@Gillesさんありがとう、私のコードには次のコードが含まれています~/.bashrc
。
bind '"\e[99i~": re-read-init-file'
bind -x '"\e[99b~": . ~/.bashrc'
bind '"\C-xr": "\e[99i~\e[99b~"'
bash
クリックすると、C-x r
理解できないエラーメッセージが記録されることを除いて機能します。
\udccf\udccf\udccf\udccf\udccf\udccf: command not found
私はこれが私が変更した他の設定とのやり取りによるものかもしれないと思い、~/.bashrc
キーバインディングを定義する3行を除くすべての項目を削除しましたC-x r
。
しかし、まだエラーメッセージがあります。
: command not found
だから私はbashrc
単一のキーバインディングでより簡単なアプローチを試しました。
bind -x '"\C-xr": . ~/.bashrc'
今回クリックするとC-x r
エラーが発生します。
\udccf
: command not found
bind -x '"\C-xr": . ~/.bashrc'
しかし、ファイルの行に注釈を付け、インタラクティブbashrc
シェルでコマンドを実行すると、bash
すべてがうまく機能します。エラーメッセージがなく、構成が正しく再構成されました。
だから私はbash
(すでに完了している場合)オーバーライドを防ぐために、このキーバインドの周りにガードを作成する必要があると思いました。しかし、キーバインディングが存在するかどうかをテストする方法がわかりません。また、これらのエラーによって何が起こるのかをよりよく理解したいと思います。
これが重要かどうかはわかりませんが、bash
直接は開始しません。常にifで始まりますzsh
。 Bashスクリプトに書き込まれるいくつかのコマンドをテストするには、ターミナル(デフォルトのシェルとして使用されます)を開き、そこでzsh
実行します。bash
それでは、最初のエラーメッセージを生成したいくつかの環境変数が継承されている可能性がありますかbash
?zsh
また、コメントセクションで要求されたように、以下はhexdump -C ~/.bashrc
3つのキーバインディングのみを使用した出力です。
00000000 62 69 6e 64 20 20 20 20 27 22 5c 65 5b 39 39 69 |bind '"\e[99i|
00000010 7e 22 3a 20 72 65 2d 72 65 61 64 2d 69 6e 69 74 |~": re-read-init|
00000020 2d 66 69 6c 65 27 0a 62 69 6e 64 20 2d 78 20 27 |-file'.bind -x '|
00000030 22 5c 65 5b 39 39 62 7e 22 3a 20 2e 20 7e 2f 2e |"\e[99b~": . ~/.|
00000040 62 61 73 68 72 63 27 0a 62 69 6e 64 20 20 20 20 |bashrc'.bind |
00000050 27 22 5c 43 2d 78 72 22 3a 20 20 20 22 5c 65 5b |'"\C-xr": "\e[|
00000060 39 39 69 7e 5c 65 5b 39 39 62 7e 22 27 0a |99i~\e[99b~"'.|
0000006e
bashrc
以下は、以下のみを含む16進ダンプですbind -x '"\C-xr": . ~/.bashrc'
。
00000000 62 69 6e 64 20 2d 78 20 27 22 5c 43 2d 78 72 22 |bind -x '"\C-xr"|
00000010 3a 20 2e 20 7e 2f 2e 62 61 73 68 72 63 27 0a |: . ~/.bashrc'.|
0000001f
私のコンテンツ全体は次のとおりですbashrc
。
case "$-" in
*i*) ;;
*) return ;;
esac
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
PS1="${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ "
alias cdr='cd "$(ls -dt */ | head -1)"'
export HISTCONTROL="ignoreboth:erasedups"
export HISTIGNORE="clear:history:"
export HISTFILE="${HOME}/.bash_eternal_history"
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
export PROMPT_COMMAND="history -a; history -c; history -r; ${PROMPT_COMMAND}"
cd() {
if [ $# -eq 2 ]; then
builtin cd "${PWD/$1/$2}"
elif [ $# -eq 1 ]; then
builtin cd "$1"
else
builtin cd
fi
}
shopt -s autocd
shopt -s checkwinsize
shopt -s globstar
shopt -s histappend
shopt -s histreedit
shopt -s histverify
. /usr/share/bash-completion/bash_completion
. ~/.fzf.bash
. ~/.shrc
bind '" ": magic-space'
bind '"\C-xc": "\C-a\C-kvimdiff <() <()\C-b\C-b\C-b\C-b\C-b"'
bind '"\C-xf": character-search'
bind '"\C-xF": character-search-backward'
bind '"\e[99i~": re-read-init-file'
bind -x '"\e[99b~": . ~/.bashrc'
bind '"\C-xr": "\e[99i~\e[99b~"'
bind '"\C-x\C-s": "sudo !!\C-m\C-m"'
bind -x '"\C-x\C-t": fzf-file-widget'
bind '"\C-t": transpose-chars'
bind '"\C-x\C-v": "\C-e | vim -R -\C-m"'
bind '"\em": "\C-aman \ef\C-k\C-m"'
bind '"\e\C-b": "\C-e >/dev/null 2>&1 &\C-m"'
編集する:
. ~/.bashrc
関数内にコマンドをラップし、キーバインディングで後者を呼び出してみました。次の構文を使用します。
bind '"\e[99i~": re-read-init-file'
bind -x '"\e[99b~": MyFunc'
bind '"\C-xr": "\e[99i~\e[99b~"'
MyFunc () {
. ~/.bashrc
}
エラーが関数名の長さの影響を受けることがわかりました。以下は、左側の列にさまざまな関数名が含まれており、右側の列にエラーメッセージ(ある場合)が含まれている表です。
┌───────────────────┬─────────────────────────────────────────────────────────────────────────────────────────────┐
│ a │ \udc99: command not found │
│ ab │ \udc92: command not found │
│ abc │ : command not found │
│ abcd │ \udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf: command not found │
│ abcde │ \udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf: command not found │
│ abcdef │ \udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf: command not found │
│ abcdefg │ no error │
│ abcdefgh │ : command not found │
│ abcdefghi │ \udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf: command not found │
│ abcdefghij │ \udcdf\udcdf\udcdf\udcdf\udcdf\udcdf: command not found │
│ abcdefghijk │ \udcdf\udcdf\udcdf\udcdf\udcdf: command not found │
│ abcdefghijkl │ \udcdf\udcdf\udcdf\udcdf: command not found │
│ abcdefghijklm │ \udcdf\udcdf\udcdf: command not found │
│ abcdefghijklmn │ \udcdf\udcdf: command not found │
│ abcdefghijklmno │ \udcdf: command not found │
│ abcdefghijklmnop │ : command not found │
│ abcdefghijklmnopq │ no error │
└───────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────┘
また、コマンド入力を. ~/.bashrc
端末に再接続する別の機能を試しました(からインスピレーションを得ました)。ここ):
bind '"\e[99i~": re-read-init-file'
bind -x '"\e[99b~": MyFunc'
bind '"\C-xr": "\e[99i~\e[99b~"'
MyFunc () {
. ~/.bashrc </dev/tty
}
結果は次のとおりです。
┌──────────────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ a │ 9}: command not found │
│ ab │ \udcdd: command not found │
│ abc │ : command not found │
│ abcd │ no error │
│ abcde │ no error │
│ abcdef │ no error │
│ abcdefg │ no error │
│ abcdefgh │ : command not found │
│ abcdefghi │ \udcdf\udcdf\udcdf\udcdf\udcdf\udcdf\udcdf: command not found │
│ abcdefghij │ \udcdf\udcdf\udcdf\udcdf\udcdf\udcdf: command not found │
│ abcdefghijk │ \udcdf\udcdf\udcdf\udcdf\udcdf: command not found │
│ abcdefghijkl │ \udcdf\udcdf\udcdf\udcdf: command not found │
│ abcdefghijklm │ \udcdf\udcdf\udcdf: command not found │
│ abcdefghijklmn │ \udcdf\udcdf: command not found │
│ abcdefghijklmno │ \udcdf: command not found │
│ abcdefghijklmnop │ : command not found │
│ abcdefghijklmnopq │ no error │
│ abcdefghijklmnopqr │ no error │
│ abcdefghijklmnopqrs │ no error │
│ abcdefghijklmnopqrst │ \udccf\udccf\udccf\udccf\udccf\udccf\udccf\udccf\udccf\udccf\udccf\udccf\udccf\udccf\udccf\udccf$: command not found │
└──────────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘