MYPATH
다음 두 경로를 유지 하는 환경 변수를 내보내고 싶다고 가정 해 보겠습니다.
그래서 bash에서 다음과 같이해야한다고 생각합니다.
$export MYPATH=/full/path/to/fileA:/another/full/path/to/fileB
내가 직면 한 문제 Tab는 명령에서 경로 A를 쓰는 동안 자동 완성 ( 키)이 작동하지만 :
자동 완성이 작동을 멈춘 후에는 자동 완성이 없으면 콘솔에서 경로 B를 작성하기가 어렵습니다.
놀랍게도 다음과 같은 경우에 작동합니다.
누군가이 행동의 이유를 설명해 주시겠습니까?
설명하는 동작은 bash-completion으로 인해 발생할 수 있습니다 .
(다음은 현재 버전의 패키지 (2.9)를 기반으로하지만 현재 가지고있는 2.1 버전에 대해서도 상당히 정확합니다).
bash-completion은 Readline 라이브러리가 Bash의 명령에 인수로 제공되는 단어를 완성하는 데 사용 하는 일련의 완성 사양 ( compspec )을 제공합니다. 일반적으로 다음과 같은 형식으로 complete
내장 명령을 사용하여 정의됩니다 .
complete -F function command
들어 export
내장 함수는 _export
로 정의된다 /usr/share/bash-completion/completions/export
.
전체의 단어 (또는 끝을)를 포함 할 때 =
, _export
(첫 번째의 오른쪽에있는 부분을 완성하려고 =
파일이나 디렉토리 이름으로 실제로,); 완료 할 단어에이 포함되지 않은 =
경우 변수 이름으로 완료하려고합니다. Readline 라이브러리는 COMP_WORDBREAKS
변수에 나열된 문자 중 하나를 가로 질러 실행될 때마다 (문자가 이스케이프되지 않는 한) 새로운 완성을 시작하기 때문에 (문자가 이스케이프되지 않는 한), :
변수 값에 추가 한 첫 번째 콜론 다음에 완성 작업이 중지됩니다. 포인트, 완료 할 단어는 =
더 이상 a를 포함 (또는 끝) 하지 않습니다.
(참고로, 파일 / 디렉토리 이름 완성은 작성 export myvar=/usr/:othervar=
하고를 누르면 다시 작동하기 시작합니다 Tab.)
bash-completion에는 실제로 특수한 경우를 처리하는 자체 메커니즘이 있습니다. 예를 들어, :
는 scp
콜론의 오른쪽에있는 것을 원격 경로로 해석 하는 compspec for 에서 올바르게 처리됩니다 . 하지만에는 동일하게 적용되지 않습니다 export
.
현재 명령에 대한 compspec을 찾을 수 없을 때 트리거되는 Readline의 기본 동작 은 궁극적으로 파일 이름 완성을 시도하는 것입니다. 이것이 bash-completion이 설치되지 않았거나 비활성화되었을 때 path2
in 완료가 export var=/path1/:/path2/
작동하는 이유 입니다 (모든 콜론이 새로운 완료를 시작한다는 점을 기억하십시오).
그러면 무엇을 할 수 있습니까? 몇 가지 대안이 있습니다.
GitHub 에서 bash-completion에 대한 기능 요청을 제출합니다 .
에 대한 자신의 완성 함수를 정의하십시오 export
.
먼저 compspec을 사용자 완료 파일 (아직 존재하지 않을 가능성이 있음)에 복사합니다.
$ cat /usr/share/bash-completion/completions/export >>~/.bash_completion
그런 다음 ~/.bash_completion
으로 변경 complete -F _export export
하여 편집 complete -F _export -o default export
합니다. 이것은 export
의 특정 compspec이 결과를 제공하지 않을 때 기본 완료를 시도하도록 Readline에 지시 합니다.
bash-completion에서 제공하는 대신 기본 완성을 사용하십시오.
에 추가 ~/.bashrc
:
complete -o default -o bashdefault export
( bash-completion의 FAQ의 제안 ). 단점은 변수 이름과 export
옵션 을 완성 할 수 없다는 것 입니다.
bash-completion에 충분히 익숙해 지려면 _export
(2)에서와 같이 :
특별히 처리 할 수 있도록 제공된 함수를 편집 하여 자신의 함수를 정의하십시오 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다