쉘 와일드카드 및 도트 파일

쉘 와일드카드 및 도트 파일

다음 두 코드가 예상대로 작동하는 이유는 무엇입니까?

ls -d .[!.]?*
echo [D]*

그러나 다음 2개는 그렇지 않습니다.

ls -d [.][!.]?*
echo [D]

첫 번째 명령에서 오류가 발생합니다.

ls: cannot access [.][!.]*: No such file or directory

같은 목록을 얻으려고 할 때 ls -d .[!.]?*. 두 번째 출력은 다음과 같습니다.

[D]

비슷한 오류 설명을 기대했을 때 No such file or directory. 내가 무엇을 놓치고 있나요? 위의 두 번째 예 세트에 표시된 와일드카드 요소가 표현식을 제거하지 않는 경우 표현식을 와일드카드로 만드는 것은 정확히 무엇입니까?

밝히다(댓글에도 있음):

와일드카드는 를 [D]*출력할 뿐만 아니라 , ... D등도 출력합니다 . 그런데 D라는 파일이 있을 때도 있고 없을 때도 시도해 봤습니다. 파일이 존재하면 출력이 작동하지만 파일이 존재하지 않을 때도 출력을 얻습니다. 이유를 모르겠습니다. 디렉터리에 파일이 있으면 식 [D]가 와일드카드에서 비와일드카드로 변경되는 이유는 무엇입니까?DesktopDownloadsecho [D]D[D]

답변1

기본적으로 bash(셸)는 점이 명시적으로 지정되지 않는 한 점(숨겨진 파일로 간주됨)으로 시작하는 파일 이름을 확장하지 않습니다. [.]이는 리터럴 문자가 아닌 패턴 이므로 숨겨진 파일 표시를 트리거하지 않으므로 ls -d [.][!.]?*어떤 것과도 일치하지 않습니다.

shopt -s dotglob파일 이름 패턴을 확장할 때("globbing"이라고 함) 항상 숨겨진 파일을 포함하도록 옵션을 설정하는 를 실행하여 이 기본 동작을 변경할 수 있습니다 .

예(줄 시작 부분의 달러 기호는 쉘 프롬프트를 나타냅니다. 입력하지 마십시오):

$ touch .foo
$ ls -d .[!.]?*
.foo
$ ls -d [.][!.]?*
ls: cannot access [.][!.]?*: No such file or directory
$ shopt -s dotglob
$ ls -d [.][!.]?*
.foo

문제는 echo [D]파일 이름이 일치하지 않으면 확장이 발생하지 않는다는 것입니다. D시도할 때 파일을 지정하지 않았 으므로 echo실제로 입력한 내용이 제공되고 에코됩니다.

파일 이름이 일치하는 경우에만 경로 이름 확장이 발생하는 예:

$ touch apple
$ echo a*
apple
$ rm apple
$ echo a*
a*

일치하는 파일을 모두 제거 [D]*하면 .echo [D]*[D]*

관련 정보