GLOBIGNORE는 어떻게 작동합니까?


15

bash 매뉴얼 페이지에 따르면 :

   GLOBIGNORE
          A colon-separated list of patterns defining the set of filenames
          to be ignored by pathname expansion.  If a filename matched by a
          pathname  expansion  pattern also matches one of the patterns in
          GLOBIGNORE, it is removed from the list of matches.

그러나 실제로는 ...

$ bash --noprofile --norc
bash-4.2$ touch .bar
bash-4.2$ echo .*
. .. .bar
bash-4.2$ GLOBIGNORE=.
bash-4.2$ echo .*
.bar

..일치 목록에서 제거됩니까? 내가 아는 한 패턴 .이 일치 ..하지 않습니까?

답변:


14

아래로 스크롤 ...

파일 이름 .이며 null이 아닌 ..경우 항상 무시됩니다 GLOBIGNORE.

대부분의 경우 디렉토리 내부의 파일을 나타내지 않기 때문에 와일드 카드 일치 항목 을 포함 .하고 ..와일드 카드 일치 항목 으로 포함하는 것은 바람직 하지 않습니다. 사실, 도트 파일의 출처 ls명령 의 초기 버전에서 버그입니다 . 저자 는 목록에서 제외 .하고 ..목록에서 제외 했지만 실수로로 시작하는 모든 파일을 제외했습니다 .. 따라서 도트 파일이에서 숨겨졌습니다 ls. 쉘은 다음과 같은 도트 파일을 숨겨서 적합합니다 ls. 그러나 이것이 행해진 방식은 다시 해킹이었습니다. 시작하는 파일 .은 패턴에서 점이 명시 적으로 일치하지 않는 경우에만 제외됩니다. 따라서 패턴 .*에는 .및이 포함됩니다 ...

기존 스크립트와의 호환성을 유지하기 위해 최신 쉘에는 여전히 및가 포함 .되어 있습니다 ..(zsh 제외). 그러나을 설정 GLOBIGNORE하면 bash 특정 기능을 사용하고 있습니다.이 기능은 이전 버전과의 호환성에 관심이 없음을 나타냅니다. 패턴 매칭 제외 변경 그래서 .하고 ..모든 패턴 일치에서.

설정 GLOBIGNORE=.제외 할 때마다 어쨌든 자동으로 제외 된 파일 GLOBIGNORE설정이하는 것과 동일하므로, shopt -s dotglob그것을 제외시켰다 .그리고 ..또한 모든 형태에서 제외됩니다.


1
실제로, 나는 단지 GLOBIGNORE무시 .하고 ..슬래시가없는 패턴으로 설정 하는 것을 깨달았고 GLOBIGNORE는 파일 이름이 아닌 파일 경로를 필터링합니다. nor를 GLOBIGNORE=.; echo .*포함 .하지는 ..않지만 GLOBIGNORE=.; echo ./.*(또는 echo /bin/.*) will! 무시 .하고 ..당신이 필요로하는 것처럼 모든 globs의에서, 그것은 외모 shopt -s extglobGLOBIGNORE='?(*/)@(.|..)'.
Stéphane Chazelas

1
사실, 아니, GLOBIGNORE='?(*/)@(.|..)'제외하지 않을 것이다 ....*/foo. GLOBIGNORE='?(*/)@(.|..)?(/*)'같은 globs의 휴식 것입니다 ./*...
스테판 Chazelas가

3

에서 "경로 이름 확장을"이라는 제목의 섹션에서 man bash:

GLOBIGNORE가 설정되고 널이 아닌 경우 파일 이름 ''. ''및 ''.. ''은 항상 무시됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.