PS1='$(pwd)' 이것이 작동하는 이유는 무엇이며 이것이 PS1=$(pwd)와 다른 이유는 무엇입니까?

PS1='$(pwd)' 이것이 작동하는 이유는 무엇이며 이것이 PS1=$(pwd)와 다른 이유는 무엇입니까?

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

PS1='$(pwd)'

나는 보간이 없음을 의미하는 작은따옴표를 사용합니다. 즉 echo '$(pwd)'--→$(pwd)

또한 이것이 작동하는 이유를 명확히 한다고 가정하면... 왜 다르게 작동합니까 PS1=$(pwd)? (인용문은 전혀 없습니다)

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

왜?

답변1

단순히 변수에 값을 할당하는 경우 $(...)작은따옴표로 묶이지 않거나 백슬래시로 이스케이프되지 않는 한 표현식이 평가됩니다. 이해하려면 다음 두 가지를 비교해 보세요.

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

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

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

답변2

Bash 및 zsh에서는 값이 PS1프롬프트로 사용되지 않고 다소 확장됩니다. 두 쉘의 규칙은 다르지만 두 경우 모두 단계 중 하나는 일반 쉘 구문(,, 또는,, ). 값).$VARIABLE${VARIABLE}$(COMMAND)`COMMAND`$((EXPRESSION))$[EXPRESSION]

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

프롬프트에서 달러 확장이 켜져 있으면 6자 값으로 PS1='$(pwd)'설정하여 쉘이 새 프롬프트를 표시할 때마다 명령이 실행되도록 합니다 . 반면, 당시 쉘의 현재 작업 디렉터리로 설정됩니다 . USD 확장을 끄면 프롬프트가 리터럴 문자열이 됩니다 .PS1$(pwd)$(pwd)pwdPS1=$(pwd)PS1PS1='$(pwd)'$(pwd)

프롬프트에서 작업 디렉터리를 가져오는 더 편리한 방법이 있습니다.

  • 배쉬에서는 다음을 사용하십시오.백슬래시 이스케이프예를 들어 \w, 홈 디렉토리를 로 축약하고 ~설정을 통해 정리할 수 있습니다 PROMPT_DIRTRIM.
  • zsh에서는 다음을 사용하십시오.탈출율예를 들어%/또는%~( , 축약형 홈 디렉토리 %/와 동일 ) 정리 설정을 할 수 있습니다.$PWD%~
  • 두 셸(및 기타 Bourne 스타일 셸)에서 $PWD이에 상응하는 내용은 다음과 같습니다 $(pwd). 현재 작업 디렉터리를 가져오기 위해 하위 프로세스를 실행할 필요가 없습니다.

답변3

따옴표가 없으면 PS1을 설정할 때 $(pwd)가 평가됩니다. 따옴표를 사용하면 프롬프트가 표시될 때까지 $(pwd) 평가가 연기됩니다.

따옴표가 없으면 PS1을 설정할 때 PS1이 현재 디렉터리로 설정됩니다. PS1은 작은따옴표를 사용하여 $(pwd)로 설정됩니다. 이는 프롬프트가 표시될 때마다 현재 디렉터리를 평가하고 인쇄한다는 의미입니다.

관련 정보