Bash에서 히스토리 확장은 언제 발생합니까?

Bash에서 히스토리 확장은 언제 발생합니까?

역사적 확장은 언제 발생하는가?

  1. 배쉬 매뉴얼에서

    문자를 큰따옴표('"')로 묶으면 기록 확장이 활성화된 경우 '$', '`', '\' 및 '!'를 제외한 따옴표 안의 모든 문자의 리터럴 값이 유지됩니다.

    파서는 파싱 단계에서 큰따옴표를 인식하므로 파싱 후에 히스토리 확장을 수행해야 하는 것이 맞습니까?

    그렇다면 쉘 확장(예: 중괄호 확장, 매개변수 확장, 파일 이름 확장 등)은 언제 발생합니까?

  2. 하지만 히스토리 확장은 쉘의 readline에 의해 제공되므로 어휘 분석 및 구문 분석 전에 처리된다고 생각했습니다. 셸의 자동 완성과 같습니다. 내가 뭐 놓친 거 없니?

감사해요.

답변1

인용하다배쉬 매뉴얼:

히스토리 확장은 쉘이 행을 단어로 나누기 전에 전체 행을 읽은 후 즉시 수행됩니다.

히스토리 확장은 쉘 구문 분석 이전에도 처리의 첫 번째 단계이므로 큰따옴표가 사용됩니다.아니요protected !: 후자는 큰따옴표 이전에 처리됩니다. 이는 자체 구문 분석을 구현하고 기록 연산자를 보호하는 여러 가지 방법이 있는 기록 라이브러리에 의해 처리됩니다.

역사적 확장 문자를 이스케이프하는 데 ' \' 및 ' ''만 사용할 수 있지만, 역사적 확장 문자도 큰따옴표로 묶인 문자열에서 닫는 큰따옴표 바로 앞에 있는 경우 인용된 것으로 처리됩니다.

쉘의 파서가 문자열 처리를 시작하면 이미 히스토리 라이브러리에 의해 파싱되었으며 히스토리 확장이 발생한 것입니다.

답변2

@Stephen Kitt가 말했듯이 기록 확장은 첫 번째 단계에서 수행되어야 합니다. 이 패턴은 다음과 같이 이해할 수 있습니다. 임의의 bash 코드를 입력하면 다음과 같습니다.

echo "the value of a is $a" > tmp

그런 다음 사용 내역 확장을 사용합니다.

!-1

분명히 위의 줄은 동일한 작업을 다시 수행합니다. 우리가 주목해야 할 점은 첫 번째 !-1로 확장 된다는 것입니다 . 이 확장이 구문 분석 단계 이후에 발생했다면 올바르게 구문 분석되지는 않지만 실제로는 발생하지 않는다는 echo "the value of a is $a" > tmp점을 깨달아야 합니다 .$a

관련 정보