경로 이름 확장 압축 풀기 및 echo 'a'에서 따옴표 제거*

경로 이름 확장 압축 풀기 및 echo 'a'에서 따옴표 제거*

셸은 다음과 같습니다: GNU bash, 버전 5.1.16(1)-릴리스(x86_64-pc-linux-gnu)

현재 작업 디렉터리에는 두 개의 파일이 있습니다.

  • 이름이 사람abc.txt
  • 'a'bc.txttouch \'a\'bc.txt이름이 지정된 파일 (다음을 사용하여 생성됨)

다음 명령을 실행합니다.

echo 'a'*

출력은 다음과 같습니다

abc.txt

GNU bash 매뉴얼은 경로 이름 확장 후에 따옴표 제거가 처리되도록 지정합니다.

그래서 이 명령이 일치할 것으로 예상했지만 'a'bc.txt일치하지 않았습니다 abc.txt. !

위 명령이 다음과 같이 진행될 것으로 예상됩니다.

  • 경로 이름 확장 단계에서 파일 이름이 'a'( 'a'리터럴 문자열로) 로 시작하여 일치하는 모든 파일과 일치하려고 시도합니다.'a'bc.txt
  • '따옴표 제거 단계에서는 'a' 이전 단계에서 발생한 경로 이름 확장 결과에 영향을 주지 않고 in 의 작은따옴표가 제거됩니다.

분명히 여기에 내가 이해하지 못하는 뭔가가 있습니다.

이 특정 질문에 대한 문서나 답변을 찾을 수 없습니다.

답변1

설명하는 방식에 따르면 일치가 불가능합니다 *. 현재 작동하는 방식은 첫 번째 별표가 인용된 위치를 쓸 수 있으므로 '*'*리터럴이고 두 번째 별표는 무엇이든 일치한다는 특별한 의미를 유지한다는 것입니다. 따옴표(및 대칭 백슬래시) 자체가 파일 이름에서 일치하는 문자를 찾아야 하는 경우 이는 불가능합니다.


쉘의 내부 구현이 어떻게 작동하는지 또는 "인용문 삭제"라는 문구 뒤에 기록이 무엇인지 잘 모르겠지만 인용된 문자의 (숨겨진) 속성 상태에 대해 생각하는 것이 더 낫다는 것을 알았습니다. 명령줄이 처음 처리된 후에는 따옴표 문자가 실제로 별도의 엔터티로 존재한다고 생각하세요.

따라서 을 쓸 때 (적어도 거의 보이지 않기를 바라지만) 굵은 글씨로 문자가 인용된 것으로 표시됩니다 '*'*. **그런 다음 리터럴 인용문과 일치시키려면 인용문을 인용하거나 이스케이프 처리해야 합니다. 예를 들어, , 즉 quote-asterisk-quote와 일반적으로 특수 별표가 "'*'"*제공됩니다 . '*'*(일부 초기 쉘 구현에서는 바이트의 8번째 비트를 사용하여 인용 문자를 표시했다고 들었는데, 물론 이는 7비트 문자 세트에서만 작동합니다.)

또는 원하는 경우 따옴표를 특수 문자로 처리합니다. 이는 대상 문자열의 문자와 일치하는 것이 아니라 다른 문자가 따옴표로 묶였는지 여부를 확인하는 데만 사용됩니다.

관련 정보