MYPATH
다음 2개의 경로를 포함하는 환경 변수를 내보내고 싶다고 가정해 보겠습니다 .
- /전체/경로/to/fileA
- /다른/전체/경로/to/fileB
그래서 저는 이것이 bash에서 이루어져야 한다고 생각합니다:
$export MYPATH=/full/path/to/fileA:/another/full/path/to/fileB
내가 직면한 문제는 Tab명령에 경로 A를 쓸 때 자동 완성(키)이 작동하지만 :
그 후에는 자동 완성이 작동을 멈추기 때문에 자동 완성 없이 콘솔에 경로 B를 쓰기가 어렵다는 것입니다.
놀랍게도 다음 조건이 충족되면 작동합니다.
- 콜론 대신 세미콜론을 사용했지만 어쨌든 올바른 경로 구분 기호는 아닙니다.
- 저는 루트 사용자입니다.
누구든지 이 동작의 이유를 설명할 수 있습니까?
- Bash 버전: GNU bash, 버전 4.3.48(1)-릴리스(x86_64-pc-linux-gnu)
- Bash 완성 버전: all/xenial-updates 1:2.1-4.2ubuntu1.1
- 운영 체제 버전: Ubuntu 16.04.6 LTS
답변1
설명하신 동작은 다음으로 인해 발생할 수 있습니다.배쉬 완료.
(다음은 현재 패키지 버전(2.9)을 기반으로 하지만 사용 중인 2.1 버전에서는 상당히 정확합니다.)
bash-completion은 일련의 완료 사양을 제공합니다(상대적으로 표준화된), Bash의 명령에 인수로 제공되는 단어를 완성하기 위해 Readline 라이브러리에서 사용됩니다. 그들은 다음을 사용하여 정의됩니다.complete
내장 명령, 일반적으로 다음과 같은 형식입니다.
complete -F function command
export
내장 함수 의 경우 해당 함수 _export
는 에 정의되어 있습니다 /usr/share/bash-completion/completions/export
.
완성될 단어에 가 포함되거나 로 끝나는 경우 파일 또는 디렉터리 이름으로 완성을 시도합니다 =
( _export
실제로는 첫 번째 오른쪽 부분 =
). 완성될 단어에 가 포함되어 있지 않으면 =
완성을 시도합니다. 변수 이름에. Readline 라이브러리는 변수에 나열된 문자 중 하나(문자가 이스케이프되지 않는 한)(일반적으로 포함됨)를 만날 때마다 COMP_WORDBREAKS
새로운 완성을 시작하기 때문에 :
변수 값 Work에 추가된 첫 번째 콜론 이후 완성이 중지됩니다. , 요점은 완성될 단어가 더 이상 a를 포함하거나 끝나지 않는다는 것입니다 =
. (단, 쓰고 클릭하면
파일/디렉터리 이름 완성이 다시 시작되니 주의하세요.)export myvar=/usr/:othervar=
Tab
bash-completion에는 특별한 경우를 처리하기 위한 자체 메커니즘이 있습니다. 예를 들어, 이는 콜론 오른쪽의 내용을 원격 경로로 해석하는 :
compspec for 에 의해 올바르게 처리됩니다 . scp
그러나 동일하게 적용되지 않습니다 export
.
독서선기본 동작, 현재 명령에 대한 compspec을 찾을 수 없을 때 트리거되어 결국 파일 이름 완성을 시도합니다. 이것이 bash-completion이 설치되지 않았거나 비활성화되었을 때 완료가 작동하는 이유입니다 path2
(각 콜론이 새로운 완료를 시작한다는 점을 기억하십시오).export var=/path1/:/path2/
그럼 당신은 무엇을 할 수 있나요? 몇 가지 대안이 있습니다.
기능 요청 제출 대상:GitHub의 bash 완성.
자신만의 완성 기능을 정의하세요
export
.
먼저 compspec을 사용자 완성 파일에 복사합니다(아직 없을 수도 있음).$ cat /usr/share/bash-completion/completions/export >>~/.bash_completion
그런 다음 을 편집하고
~/.bash_completion
로complete -F _export export
변경합니다complete -F _export -o default export
.export
이는 특정 구성 요소가 결과를 제공하지 않을 때 기본 완성을 시도하도록 Readline에 지시합니다.bash-completion에서 제공하는 완성 대신 기본 완성을 사용하세요.
다음에 추가하세요~/.bashrc
:complete -o default -o bashdefault export
(의 제안Bash 완성에 대한 FAQ). 단점은 변수 이름과
export
옵션을 완성할 수 없다는 것입니다.bash 완성에 충분히 익숙해지려면
_export
(2)와 같이 제공된 함수를 편집하여 특별하게 만들어 자신만의 함수를 정의하세요:
.