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="";

(두 번째 줄은 \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)}'\'')"'

관련 정보