PS1 = '$ (pwd)'이것이 작동하는 이유와 이것이 PS1 = $ (pwd)와 다른 이유


18

이 명령을 입력하면 프롬프트가 디렉토리로 변경되는 이유는 무엇입니까?

PS1='$(pwd)'

작은 따옴표를 사용하고 있는데, 이는 보간이 없음을 의미합니다. echo '$(pwd)'—— →$(pwd)

또한, 왜 이것이 작동하는지 설명했습니다. 왜 다른 기능을 PS1=$(pwd)합니까? (견적 없음)

달리 말하면 따옴표를 사용하면 터미널을 탐색 할 때 프롬프트가 현재 디렉토리로 계속 변경됩니다. 그러나 따옴표를 사용하지 않으면 프롬프트는 항상 처음 명령을 입력했을 때 있던 디렉토리로 유지됩니다PS1=$(pwd)

왜?


2
일부 CPU 사이클을 저장하고 해당 PS1 = '$ PWD'사용
jlliagre

답변:


29

단순히 변수에 값을 할당 할 때 $(...)작은 따옴표 (또는 백 슬래시 이스케이프)로 묶지 않으면 표현식이 평가됩니다. 이해하려면이 두 가지를 시도하고 비교하십시오.

A=$(pwd)
echo "$A"
B='$(pwd)'
echo "$B"

값은 A즉시 문자열이 /home/yourusername되며 분명히이 문자열의 출처를 기억하지 못하며 디렉토리를 변경하더라도 동일하게 유지됩니다. B그러나 의 값은 $(pwd)해석되지 않고 리터럴 문자열이됩니다 .

이제 PS1특수한 값이 발생합니다. 프롬프트가 인쇄 될 때마다 특정 특수 구문이 해석됩니다. 예를 들어 명령 대체 $(...)A변수 할당에서 위와 동일한 방식으로 수행됩니다 . 분명히 PS1홈 디렉토리의 리터럴 문자열이 (위와 같이 A) 포함되어 있다면 변경할 수있는 방법이 없습니다. 그러나 문자열에 $(pwd)위와 같이 문자열이 포함되어 있으면 B프롬프트가 인쇄 될 때마다 평가되므로 실제 디렉토리가 표시됩니다.


14

bash와 zsh에서 값은 PS1그대로 프롬프트로 사용되지 않으며 일부 확장됩니다. 규칙은 두 개의 쉘 대해 다르지만, 두 경우 모두에서, 단계들 중 하나는 통상 셸 구문과 동일한 구문 "달러"확장 (가변 치환, 명령 치환, 산술 평가)를 수행한다 ( , , 또는 , , ) .$VARIABLE${VARIABLE}$(COMMAND)`COMMAND`$((EXPRESSION))$[EXPRESSION]

  • bash에서는 달러 확장이 기본적으로 켜져 있지만을 사용하여 끌 수 있습니다 shopt -u promptvars.
  • zsh에서 달러 확장은 기본적으로 꺼져 있지만 많은 사람들 (및 웹에서 찾을 수있는 대부분의 구성 프레임 워크)은로 확장됩니다 setopt prompt_subst.

온 프롬프트에 달러 팽창으로 PS1='$(pwd)'세트 PS16 문자 값에 $(pwd)따라서 발생 및 $(pwd)치환되어야하고, 따라서 pwd마다 새로운 셸 프롬프트 표시 명령이 실행된다. 반면에 당시 쉘의 현재 작업 디렉토리는 무엇이든 PS1=$(pwd)설정 PS1합니다. 달러 확장을 끈 PS1='$(pwd)'경우 프롬프트가 리터럴 문자열이 $(pwd)됩니다.

프롬프트에서 작업 디렉토리를 얻는 더 편리한 방법이 있습니다.

  • 배쉬에서는,와 백 슬래시 이스케이프\w으로 홈 디렉토리를 abbreviates, ~및 설정에 의해 손질 할 수있다 PROMPT_DIRTRIM.
  • zsh을에서, 함께 %의 탈출%/또는%~ ( %/동일로 $PWD, %~홈 디렉토리를 abbreviates) 트리밍 설정을 할 수있는.
  • 하나의 셸 (및 다른 Bourne 스타일 셸) $PWD은 다음과 같습니다 $(pwd). 현재 작업 디렉토리를 얻기 위해 하위 프로세스를 실행할 필요가 없습니다.

7

따옴표가 없기 때문에 $ (pwd)는 PS1이 설정 될 때 평가됩니다. 따옴표와 함께 $ (pwd)의 평가는 프롬프트가 표시 될 때까지 연기됩니다.

따옴표가 없으면 PS1이 설정 될 때 PS1이 현재 디렉토리로 설정됩니다. 작은 따옴표를 사용하면 PS1이 $ (pwd)로 설정됩니다. 즉, 프롬프트가 표시 될 때마다 현재 디렉토리를 평가하고 인쇄합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.