이 명령을 입력하면 프롬프트가 내 디렉터리로 변경되는 이유는 무엇입니까?
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)
pwd
PS1=$(pwd)
PS1
PS1='$(pwd)'
$(pwd)
프롬프트에서 작업 디렉터리를 가져오는 더 편리한 방법이 있습니다.
- 배쉬에서는 다음을 사용하십시오.백슬래시 이스케이프예를 들어
\w
, 홈 디렉토리를 로 축약하고~
설정을 통해 정리할 수 있습니다PROMPT_DIRTRIM
. - zsh에서는 다음을 사용하십시오.탈출율예를 들어
%/
또는%~
( , 축약형 홈 디렉토리%/
와 동일 ) 정리 설정을 할 수 있습니다.$PWD
%~
- 두 셸(및 기타 Bourne 스타일 셸)에서
$PWD
이에 상응하는 내용은 다음과 같습니다$(pwd)
. 현재 작업 디렉터리를 가져오기 위해 하위 프로세스를 실행할 필요가 없습니다.
답변3
따옴표가 없으면 PS1을 설정할 때 $(pwd)가 평가됩니다. 따옴표를 사용하면 프롬프트가 표시될 때까지 $(pwd) 평가가 연기됩니다.
따옴표가 없으면 PS1을 설정할 때 PS1이 현재 디렉터리로 설정됩니다. PS1은 작은따옴표를 사용하여 $(pwd)로 설정됩니다. 이는 프롬프트가 표시될 때마다 현재 디렉터리를 평가하고 인쇄한다는 의미입니다.