nullglob이 탭 완성에 영향을 미치는 이유는 무엇입니까?

nullglob이 탭 완성에 영향을 미치는 이유는 무엇입니까?

그 후 shopt -s nullglob탭 완성이 완전히 작동하지 않는 것을 발견했습니다. 왜 그럴까요?extglob분명 양성이다, nullglob은 또 어떤 영향을 미치나요?

관찰 장소:

  • 우분투 14.04 (배시 4.3.11(1)-release)
  • 아치 리눅스(bash 4.3.42(1)-release)

답변1

쉘의 동작은 상당히 다릅니다 extglob. nullglob이는 어떤 것과도 일치하지 않을 수 있는 와일드카드 문자가 포함된 단어로 인해 해당 단어가 남아 있는 것이 아니라 사라지는 것을 의미합니다.

대부분의 경우 디렉터리에 따옴표가 없는 패턴과 일치하는 파일이 포함되어 있으면 분리를 사용하는 코드 nullglob도 해당 패턴 없이 중단됩니다. 모드에 따라 이러한 파일은 존재할 가능성이 다소 높습니다(그리고 스크립트가 존재하는 파일 이름을 제어하는 ​​경우(예: 채우는 임시 디렉터리로 전환하기 때문에) 불가능할 수 있습니다).

Bash의 탭 완성은 기본적으로 nullglob의 영향을 받지 않지만 프로그래밍 가능한 완성을 구현하는 일부 bash 코드는 강력하지 않기 때문에 프로그래밍 가능한 완성이 활성화된 경우 영향을 받습니다.

열린 매개변수가 완료되면 어떤 일이 발생하는지 살펴보면 출력이 있는 것과 없는 것이 달라지기 시작하는 것을 볼 수 있습니다 ls.set -xnullglob

+ [[ 0 -gt 0 ]]
+ ref='words[0]'
+ eval 'words[0]=${!ref}${COMP_WORDS[i]}'
++ words[0]=ls
+ line=' '

(작업) 대비

+ [[ 0 -gt 0 ]]
+ ref='words[0]'
+ eval
+ line=' '

널글로브와 함께. 저 eval줄 보이세요? 이는 매개변수가 전역 패턴처럼 보인다는 것을 나타냅니다. 해당 코드는 __reassemble_comp_words_by_ref함수에 있습니다.

                # Append word separator to current or new word
                ref="$2[$j]"
                eval $2[$j]=\${!ref}\${COMP_WORDS[i]}

[은 와일드카드이고 $2[$j]=\${!ref}\${COMP_WORDS[i]}와일드카드 패턴도 와일드카드 패턴이며 의 경우 nullglob아무것도 일치하지 않으므로 제거됩니다. nullglob현재 디렉터리에 이름이 지정된 파일이 포함된 경우에도 균형이 유지됩니다. words0=${!ref}${COMP_WORDSi}이상하지만 이런 일이 발생할 수 있습니다.

해결 방법은 누락된 큰따옴표를 추가하는 것입니다.

                eval "$2[$j]=\${!ref}\${COMP_WORDS[i]}"

스크립트의 다른 부분에도 유사한 수정이 필요할 수 있지만 더 이상 조사하지 않았습니다.

이것은 bash_completion(bash 자체가 아님)의 버그입니다. 보고된다2012 년에그리고 그걸 고정해노선지도버전 3.0의 경우.

관련 정보