Bash 組み込みバインディングとエスケープに関する問題

Bash 組み込みバインディングとエスケープに関する問題

私のbashシェルに履歴ファジールックアップショートカットを追加しようとしています。ところで、私が望む命令が途中で切られています。

[april@Capybara-2:~]$ cat ~/.bashrc 
bind "\"\C-r\": \"\$(history | fzf | awk '{\$1=\"\"; print substr(\$0,2)}')\""

[april@Capybara-2:~]$ $(history | fzf | awk '{$1="";

(2行目は\ C + rを押したときの結果です)$(history | fzf | awk '{$1=""; print substr($0,2)}')。なぜ?

ベストアンサー1

これは引用地獄です。コマンドを二重引用符で囲んでいるので、\"\"Readline""の場合、コマンドは次のようになります。

bind "\C-r": "$(history | fzf | awk '{$1 = ""; ....

問題が見えますか?開始文字列は"$(最初の二重引用符で終わります"";。 Readlineの文字列連結がどのように機能するのか正確にはわかりませんが、空白以外の文字は閉じた引用符の直後に追加され、他のすべての文字は削除されるようです。

次のいずれかの方法を使用して参照を適切に変更できます。

# Extra backslashes inside double quotes
bind "\"\C-r\": \"\$(history | fzf | awk '{\$1=\\\"\\\"; print substr(\$0,2)}')\""
# Wrap the macro in single quotes instead of double quotes
bind "\"\C-r\": '\$(history | fzf | awk \'{\$1=\"\"; print substr(\$0,2)}\')'"
# Use single quotes for the `bind` command argument instead of double quotes
bind '"\C-r": "$(history | fzf | awk '\''{$1=\"\"; print substr($0,2)}'\'')"'

おすすめ記事