Gnu 화면을 실행하기 전에 가져오는 프로젝트별 설정 파일이 있습니다.
이 파일에서는 테스트 명령 및 관련 테스트에 대한 bash 완성을 설정했습니다.
다음과 같습니다.
$PROJECT_HOME/app/bin/lib/behat_suites.sh # _behat_suites() defined here
complete -F _behat_suites run_behat_suite
export -f _behat_suites
문제는 각 화면이 새로운 셸이고 complete -F
설정을 유지할 수 없다는 것입니다(나머지 환경에서는 유지됩니다. 적절한 하위 셸입니다).
이는 export
함수가 화면 하위 셸에 유지되지만 완성 설정 자체는 유지되지 않음을 의미합니다.
direnv와 같은 도구가 부족하거나 내 사용자 ~/.bashrc에 설정을 배치하는 경우 하위 쉘 프로세스가 완료된 설정을 상속하도록 하는 방법이 있습니까?
답변1
이 작업을 쉽게 수행할 수 있는 방법이 없습니다. complete -p
상위 셸의 출력을 하위 셸에 전달 해야 합니다 .
먼저, 서브셸에 추가 명령을 삽입할 수 있습니다.
$ bash --rcfile <(echo '. ~/.bash_profile')
complete -p
이제 이것을 다음과 같이 소개하려고 하면 :
$ bash --rcfile <(echo '. ~/.bash_profile'; while read line; do echo "$line"; done < <(complete -p))
complete: usage: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
거의 작동하는데, 명령을 입력할 때 버벅이는 것 같습니다 complete
. 파일을 중간 파일로 사용하려고 해도 작동하지 않습니다.
$ complete -p > /tmp/cmp.txt; bash --rcfile <(echo '. ~/.bash_profile'; echo '. /tmp/cmp.txt')
complete: usage: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
왜 실패했는지 알아내려고 노력하는 것만으로는 더 이상 사물을 밝힐 수 없습니다. 여기서는 다음을 통해 bash의 자세한 출력을 활성화합니다 -set -x
.
$ bash
$ set -x
그런 다음 방금 생성한 파일을 얻습니다.
$ . /tmp/cmp.txt
+ . /tmp/cmp.txt
++ complete -F _manila manila
++ complete -F _minimal
complete: usage: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
++ complete -F _command time
++ complete -F _command do
++ complete -o bashdefault -o default -o nospace -F __git_wrap_git_checkout gcob
따라서 특별한 일이 일어나지 않는 한 출력에 포함된 데이터는 이 특별한 경우에 이식 가능한 것으로 보이지 않습니다 complete -p
.
인용하다
답변2
당신은 넣을 필요가 없습니다모두~/.bashrc에 설정이 있지만 "한 줄짜리"를 추가하여 _behat_suites
함수가 정의되었는지 확인할 수 있습니다.그리고
완성 기능은아니요정의되어 있으면 정의가 완료된 것입니다.
다음은 읽기 쉽도록 한 줄씩 분류한 것입니다.
declare -f _behat_suites >/dev/null &&
! complete -p run_behat_suite >/dev/null &&
complete -F _behat_suites run_behat_suite