.bashrc의 함수 대신 일반 문자열 명령 사용의 의미(특히 PROMPT_COMMAND 및 PS1의 경우)

.bashrc의 함수 대신 일반 문자열 명령 사용의 의미(특히 PROMPT_COMMAND 및 PS1의 경우)

이해하는 데 어려움을 겪고 있습니다.

  • 어떻게 파싱되나요 .bashrc?
  • Bash 함수 구성 방법

터미널 프롬프트를 사용자 정의하려고 합니다. 사용 방법 .bashrc은 다음과 같습니다 PROMPT_COMMAND(실제로는 훨씬 더 복잡합니다).

function prompt_command {
    PS1="-> "
}

PROMPT_COMMAND=prompt_command

이 솔루션은 파일 외부에서 숨겨져야 하는 쉘 네임스페이스를 복잡하게 만들기 때문에 마음에 들지 않습니다 (그러나 프롬프트가 중단되기 때문에 prompt_command사용할 수 없습니다 ).unset

그래서 PROMPT_COMMAND다음과 같이 일반 텍스트를 설정할 수도 있다는 것을 알았습니다.

PROMPT_COMMAND='PS1="-> "'

내가 말했듯이 내 프롬프트 명령은 실제로 훨씬 더 복잡합니다. 그러므로 나는 이 대안의 효율성이 우려된다.

.bashrc두 가지 방법이 기능적으로 동일하더라도 my 구문 분석 및 프롬프트 명령 구성 방식에 근본적인 차이점이 있습니까? Bash는 함수 객체로 효과적으로 "컴파일"하고 "캐시"할 수 있습니까 prompt_command? 아니면 문자열을 구문 분석하는 것처럼 각각의 새로운 쉘 라인에 대해 이를 구문 분석합니까?

답변1

.bashrc새 터미널 세션이 시작될 때마다 파일이 한 번씩 구문 분석됩니다.

구문 분석 중에 함수가 prompt_command환경 변수에 추가되지만 "컴파일" 단계도 없고 "객체"로 구성되지도 않습니다.Bash는 단일 패스 통역사 언어입니다..

터미널에 새 줄이 입력되면 PROMPT_COMMAND실행되어 환경 변수에서 이를 효과적으로 검색하고 prompt_command(쉘에 입력하는 것과 같은 방식 prompt_command) 한 줄씩 실행됩니다. 따라서 동작은 명령을 에 직접 할당하는 것과 유사합니다 PROMPT_COMMAND. 직접 할당은 환경 변수를 얻을 필요가 없기 때문에 (무의식적으로) 더 빨라야 합니다.

관련 정보