와일드카드는 언제 발생합니까(여기)

와일드카드는 언제 발생합니까(여기)

Enter 키를 눌렀을 때

(cd <somewhere>/; ls -gG S09E03*

디렉터리에 일치하는 파일이 없기 때문에 오류가 발생할 것으로 예상했지만 S09E03*(이 내용을 확인했습니다) 명령을 실행하면 원하는 파일에 대한 정보가 표시되었습니다.

cd따라서 내 쉘(패치된 Debian Buster의 zsh, 즉 버전 5.7.1) 은 올바른 디렉토리(즉, 이후)에 있을 때까지 글로빙을 수행하지 않는 것 같습니다 . cd내장되어 있으므로 (기본적으로 있어야 함) 쉘이 내가 원하는 위치를 알고 있다고 생각합니까?

나 완전히 사라진 걸까? 대신, 두 개의 서로 다른 파일에 대한 정보를 표시하는 서브쉘과 무슨 관련이 있습니까? (cd <somewhere1>; ls -l <prefix>*; cd <somewhere2>; ls -l <prefix>*)그래서 그렇게 생각하지 않지만 (다시) 틀릴 수 있습니까? 아니면 다른 것이 와일드카드를 지연시키는 것입니까(제가 생각한 것과 관련하여).

  • <somewhere>꽤 길기 때문에 출력에 해당 경로가 포함되지 않도록 노력하고 있습니다.ls
  • ls -gG파일의 소유자와 그룹이 비교하고 싶은 일부 속성에 대해 파일마다 다를 수 있다는 것을 알고 있기 때문에

답변1

쉘(zsh뿐만 아니라) 완성분석하다이전 명령확장하다그런 다음구현하다그것.

  1. 구문 분석은 다음에 따라 입력을 분류합니다.쉘 구문. 이 단계에는 어떤 문자가 단어 구분 기호, 예약 문자, 명령 연산자, 리디렉션 연산자, 문서 표시자, 따옴표 등인지 식별하는 작업이 포함됩니다.
  2. 명령을 실행하면 명령 연산자( , 등)가 평가되고 ;, 간단한 명령의 경우 다음이 실행됩니다 &.|매개변수 할당,리디렉션그리고확장하다왼쪽에서 오른쪽으로.
  3. 실행 시 호출됩니다.외부 명령,내장또는 기능(있는 경우).

여기서는 매우 일반적인 개요만 제공한다는 점에 유의하시기 바랍니다. 일부 극단적인 경우는 까다롭고 쉘에 따라 다를 수 있으므로 이 게시물에서는 이에 대해 논의하지 않겠습니다.

가 주어지면 (cd subdir/; ls -gG S09E03*)쉘은 먼저 이를 구문 분석하여 다음 결과를 얻습니다.

  • 서브셸 실행 중:
    • 두 명령의 순서:
      • cd두 개의 일반 단어인 , subdir/(따옴표 없이) 로 구성된 간단한 명령입니다 .
      • ls, -gG, S09E03*(따옴표 제외) 세 개의 일반 단어로 구성된 간단한 명령입니다 .

이는 쉘이 수행하는 작업과 동일합니다. 예를 들어 함수 정의를 처리하는 경우

f () {
    (cd subdir/; ls -gG S09E03*)
}

명령이 구문 분석되면 쉘이 이를 실행합니다. 서브쉘 구성에 대한 서브쉘을 생성합니다. 서브셸 내에서 먼저 첫 번째 간단한 명령을 확장하고 실행한 다음 두 번째 명령을 확장하고 실행합니다. subdir/첫 번째 단순 명령을 실행하는 동안 현재 디렉터리가 로 변경됩니다. 확장 S09E03*(즉, 와일드카드 단계가 발생하는 위치)은 나중에 발생합니다.

그런데 서브셸은 단지 세부 사항일 뿐이며 아무것도 변경하지 않습니다. ;두 명령을 분리하고 첫 번째 명령이 두 번째 명령보다 먼저 실행되도록 하는 것이 중요합니다 .

"쉘이 내가 원하는 위치를 알고 있다"는 것이 아니라, 발생하는 곳에서 발생합니다. 명령 매개변수의 확장은 항상 명령 자체와 동일한 디렉터리에서 발생합니다(이 작업을 수행하기 위해 내장 함수를 호출할 수 있는 마지막 단계를 제외하고 명령 실행의 어떤 부분도 현재 디렉터리를 변경할 수 없습니다). 기능).

관련 정보