서브셸이 bash를 상속하여 설정을 완료하도록 하는 방법은 무엇입니까?

서브셸이 bash를 상속하여 설정을 완료하도록 하는 방법은 무엇입니까?

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

관련 정보