콜론을 별칭으로 사용하면 자동 완성 기능이 중단됩니다.

콜론을 별칭으로 사용하면 자동 완성 기능이 중단됩니다.

.NET에서 별칭으로 콜론이나 다른 접두사를 사용합니다 .bashrc.

제가 한동안 사용했던 단축키는 다음과 같았습니다.

alias :t="tmux"
alias :www="google-chrome --use-gl=desktop &>/dev/null &"
alias :ide="bash ~/netbeans-11.3/netbeans/bin/netbeans &>/dev/null &"
alias :bsh="/bin/bash"
alias :c="clear"
alias :d="docker"
alias :dc="docker-compose"

효과가 있었습니다. 하지만 콜론으로 인해 자동 완성이 작동하지 않는 문제가 발생했습니다.

complete -F _docker :d

완료를 호출하면 :d아무 것도 표시되지 않습니다.

충돌이었나? 어떻게 해결할 수 있나요? 충돌이 더 많이 일어날 것 같나요? 내가 뭐 잘못 했어요?

답변1

Bash에서는 콜론이 불법이 아닙니다.별명이름. 명시적으로 금지되는 문자는 , \, ", ', <space>, <tab>, <newline>, |, &, ;, (, ), <, >, /, 입니다 $.`=

당신이 가지고 있다고 가정배쉬 완료설치 후 두 가지 문제가 발생할 수 있습니다. 첫 번째 문제는 일반적으로 이름에 콜론이 있는지 여부에 관계없이 별칭과 관련이 있습니다.

  1. 완료 함수는 지연 로드됩니다.

      # In a freshly opened shell
    $ alias bar='docker'
    $ complete -F _docker bar
    $ declare -pF _docker
    bash: declare: _docker: not found
      # Typing "bar", TAB, TAB:
    $ bar bash: completion: function `_docker' not found
    

    이 문제를 해결하려면 필요한 함수를 명시적으로 로드할 수 있습니다(또는 기본 완성 함수 주위에 래퍼를 작성 _completion_loader하고 별칭도 처리하도록 할 수 있습니다).

      # ...continue
    $ _completion_loader docker
    $ declare -pF _docker
    declare -f _docker
      # Typing "bar", TAB, TAB:
    $ bar 
    attach     container  ...
    
  2. 독서선(라인 편집 및프로그래밍 가능한 완성Bash)에 포함된 항목을 처리합니다.COMP_WORDBREAKS변수는 단어 구분 기호 역할을 하며 :기본적으로 PATH콜론으로 구분된 경로 목록을 포함하는 변수에 대한 할당과 같은 사용 사례를 지원하기 위해 그 안에 배치됩니다(예:). 따라서 명령줄을
    완성하려고 하면 완성 함수에 완성해야 할 잘못된 단어 배열이 제공됩니다. :foo구체적으로,COMP_WORDS1개의 빈 문자열 대신 빈 문자열 :이 됩니다 .foo:foo

    이것은 bash-completion에서 언급되었습니다.GitHub의 FAQ. "문제. 콜론이 포함된 작업을 완료하려고 하면 완료 오류가 발생합니다."를 참조하세요.

    이 FAQ에서 제안된 유일한 해결책은 명령줄에서 콜론을 백슬래시로 이스케이프 처리하는 것입니다.

      # In a freshly opened shell
    $ alias :foo='docker'
    $ complete -F _docker :foo
    $ _completion_loader docker
      # Typing "\:foo", TAB, TAB:
    $ \:foo 
    attach     container  ...
    

    안타깝게도 명령 앞에 백슬래시를 추가하면 Bash가 별칭 확장을 수행할 수 없어 "명령을 찾을 수 없음" 오류가 발생합니다. 그러나 별칭 대신 함수(예: )를 정의하는 옵션이 있는 경우 :d () { docker "$@"; }이 솔루션이 작동합니다 .

    물론 :from 을 제거할 수도 있지만 이렇게 하면 다음과 같이 명령줄 자동 완성이 COMP_WORDBREAKS중단됩니다 .PATH

    $ COMP_WORDBREAKS=${COMP_WORDBREAKS/:/}
      #  Typing "PATH=/bin:/", TAB doesn't complete any further:
    $ PATH=/bin:/
    

관련 정보