Bash 또는 Zsh에서 "*/"의 의미에 대한 명확한 답을 어디서 찾을 수 있나요?

Bash 또는 Zsh에서 "*/"의 의미에 대한 명확한 답을 어디서 찾을 수 있나요?

나는 그것이 무엇을 의미하는지 알아보기 위해 Unix와 Bash에 대한 O'Reilly의 참고 자료를 살펴보았지만 */아무 것도 찾을 수 없었습니다. echo */모든 디렉토리를 볼 수 있습니다 .

이는 단지 "모든 디렉토리"를 의미하는 것처럼 보이지만 *오히려 "모든 파일 및 디렉토리"를 의미하는 것처럼 보이지만 어떤 이유로 많은 사용자가 이에 대해 알지 못하는 것 같고 책에서는 이에 대해 언급하지 않습니다.

*/그 의미와 변형 에 대해 이야기하는 명확한 출처가 있습니까 ?

답변1

이것POSIX 사양UNIX 도구의 작동 방식에 대한 권위 있는 참조 자료입니다. 이것경로 이름 확인 정보파일 이름 뒤에 오는 슬래시의 의미를 설명하세요.

하나 이상의 <슬래시>가 아닌 문자를 포함하고 하나 이상의 후행 <슬래시> 문자로 끝나는 경로 이름은 후행 <슬래시> 문자 앞의 마지막 경로 이름 구성 요소가 기존 디렉토리나 디렉토리 항목을 지정하지 않는 한 성공적으로 구문 분석되어서는 안 됩니다. 경로 이름을 구문 분석한 후 즉시 디렉터리에 대해 생성됩니다.

즉, 기존 디렉토리이거나 프로그램이 생성할 디렉토리(따라서 허용되는 디렉토리) foo/여야 합니다 . 다른 유형의 파일(일반 파일, 파이프 이름 등)인 경우에는 해당 파일에 액세스할 수 없습니다.foomkdir foo/foofoo/

위의 문장은 불완전합니다. foo/실제로는 디렉토리 심볼릭 링크를 참조하는 유효한 방법입니다. 세부사항은 다음과 같습니다:

경로 이름 확인 중에 기호 링크가 발견되면 경로 이름 구성 요소가 경로 이름 끝에 있는지 여부와 수행 중인 기능에 따라 동작이 달라집니다. 다음 조건이 모두 참이면 경로 이름 확인이 완료됩니다.

1. 이는 경로 이름의 마지막 경로 이름 구성 요소입니다. 2. 경로 이름이 뒤에 있지 않습니다. 3. 함수가 기호 링크 자체에서 작동해야 하거나 일부 매개변수는 함수가 기호 링크 자체에서 작동함을 나타냅니다.

다른 모든 경우에는 시스템이 나머지 경로 이름(있는 경우) 앞에 기호 링크(...)의 내용을 붙여야 합니다.

즉, foo기호 링크이고 프로그램이 기호 링크를 따라야 한다면 foo/이는 링크의 대상(디렉토리일 수 있음)과 동일합니다. 따라서 foo디렉터리에 대한 심볼릭 링크인 경우 foo/해당 디렉터리를 참조하는 유효한 방법입니다. 그러나 foo일반 파일이거나 디렉토리가 아닌 기타 기호인 경우 이는 foo/파일을 참조하는 유효한 방법이 아닙니다.

다음과 같은 기능openENOTDIR지정된 경로 이름에 슬래시가 있고 기존 디렉터리가 아닌 경우 오류가 반환됩니다.

[ ENOTDIR]
(…) O_CREATO_EXCL지정되지 않은 경우, 경로 인수는 <슬래시>가 아닌 문자를 하나 이상 포함하고 하나 이상의 후행 <슬래시> 문자로 끝나고, 마지막 경로 이름 구성 요소는 디렉토리도 아니고 디렉토리도 아닌 기존 파일 디렉토리의 이름을 지정합니다. 디렉토리 심볼릭 링크(...)

슬래시의 효과는 */다음에 암시적으로 설명되어 있습니다.패턴 매칭에 대해sh. in 패턴에는 특별한 규칙이 없습니다 /(괄호 안에 표시할 수 없다는 규칙은 여기서는 관련이 없습니다). 따라서 /패턴의 a는 /경로 이름의 a와 일치해야 합니다. 예를 들어 패턴은 */일치 foo/하지만 일치하지 않습니다 foo. 따라서 */디렉터리와 디렉터리에 대한 심볼릭 링크는 일치하지만 일반 파일, 일반 파일에 대한 심볼릭 링크, 끊어진 심볼릭 링크, 명명된 파이프 등은 일치하지 않습니다.

답변2

몇 개 있어요힌트디렉토리와만 일치해야 하는 것은 */bash 매뉴얼입니다(강조):

  1. *
    빈 문자열을 포함하여 모든 문자열과 일치합니다. globstar 쉘 옵션이 활성화되고 *가 경로 이름 확장 컨텍스트에서 사용되는 경우 단일 패턴으로 사용되는 두 개의 인접한 *는 모든 파일과 0개 이상의 디렉터리 및 하위 디렉터리와 일치합니다. 뒤에 /가 오면 인접한 두 개 *디렉터리 및 하위 디렉터리만 일치합니다..

    a는 디렉토리 및 하위 디렉토리에만 일치한다는 것은 명백하며 **/이는 a */도 일치해야 함을 의미하는 것 같습니다.

  2. globstar
    설정되면 경로 이름 확장 컨텍스트 **에 사용되는 패턴은 모든 파일과 0개 이상의 디렉터리 및 하위 디렉터리와 일치합니다. 패턴 뒤에 /가 오면 디렉터리와 하위 디렉터리만 일치합니다..

    위의 팁을 반복하세요.

zsh 매뉴얼에서:

  1. -g globstring은
    파일 이름 와일드카드를 사용하여 globstring을 확장합니다. 즉시 확장되지 않도록 인용해야 합니다. 결과 파일 이름은 가능한 완성으로 간주됩니다. 사용`*(/)' `*/'디렉토리 대신.

    이는 a가 */디렉토리를 나타내야 함 을 분명히 나타냅니다.다른 곳에서는.

그러나 유일한 실제 확인은 ksh 매뉴얼에서 나옵니다.

*
빈 문자열을 포함하여 모든 문자열과 일치합니다. 파일 이름 확장에 사용될 때 globstar 옵션이 활성화되면 두 개의 인접한 * 자체가 모든 파일과 0개 이상의 디렉터리 및 하위 디렉터리와 일치합니다. 만약에 뒤에 /가 오면 디렉터리와 하위 디렉터리만 일치합니다..

이는 싱글톤이 무엇을 *해야 하는지 명확하게 설명합니다.

POSIX가 주로 ksh 작동 방식을 기반으로 하고 있고 bash와 zsh가 ksh 작동 방식을 에뮬레이션하려고 시도한다는 점을 고려하면 세 매뉴얼 모두 동일한 기능을 반복할 것으로 예상하는 것이 합리적입니다.

답변3

다음에서 몇 가지 설명을 찾을 수 있습니다.bash 매뉴얼, 패턴 매칭

3.5.8.1 패턴 매칭

아래 설명된 특수 패턴 문자를 제외하고 패턴에 나타나는 모든 문자는 자체적으로 일치합니다. NUL 문자는 패턴에 나타날 수 없습니다. 백슬래시는 다음 문자를 이스케이프합니다. 이스케이프된 백슬래시는 일치 시 삭제됩니다. 특수 패턴 문자를 문자 그대로 일치시키려면 따옴표로 묶어야 합니다.

특수 패턴 문자의 의미는 다음과 같습니다.

*

빈 문자열을 포함하여 모든 문자열과 일치합니다. globstar 쉘 옵션이 활성화되고 "*"가 사용되는 경우파일 이름 확장자 컨텍스트, 단일 패턴으로 사용된 두 개의 인접한 "*"는 모든 파일과 0개 이상의 디렉터리 및 하위 디렉터리와 일치합니다. 뒤에 "/"가 오면 인접한 두 "*"는 디렉터리 및 하위 디렉터리에만 일치합니다.

그리고Linux 문서화 프로젝트아래에서 설명을 찾을 수 있습니다 echo *.

불다파일 이름 확장 수행따옴표가 없는 명령줄 매개변수에 관한 것입니다. echo 명령이 이를 보여줍니다.

bash$ echo * a.1 b.1 c.1 t2.sh test1.txt`

bash$ echo t* t2.sh test1.txt

bash$ echo t?.sh t2.sh```

답변4

확장은 */쉘에 특별한 의미가 없습니다. 확장과 정확히 동일하게 *.txt모든 항목이 나열됩니다.기존 경로 이름에 종료됩니다 .txt.

~을 위한어느셸에서 a는 */로 시작하는 모든 문자로 확장됩니다 /.

유일한 문제는 a가 pathnamea로 끝날 수 있는 때를 이해하는 것입니다 /.

마지막 파일 이름이 존재하고 디렉터리인 경우에만 가능합니다.

명시적 확인(man ksh에서):

*
...뒤에 /가 오는 경우 디렉터리 및 하위 디렉터리만 일치합니다.

관련 정보