私の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)}'\'')"'