내 bash 쉘에 기록 퍼지 조회 단축키를 추가하려고 합니다. 그런데 제가 원하는 명령어가 중간에 잘려있습니다.
[april@Capybara-2:~]$ cat ~/.bashrc
bind "\"\C-r\": \"\$(history | fzf | awk '{\$1=\"\"; print substr(\$0,2)}')\""
[april@Capybara-2:~]$ $(history | fzf | awk '{$1="";
(두 번째 줄은 \C+r을 눌렀을 때의 결과입니다.) \C+r이 that 에 바인딩되어야 한다고 예상했는데 $(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)}'\'')"'