이 명령을 입력하면 프롬프트가 디렉토리로 변경되는 이유는 무엇입니까?
PS1='$(pwd)'
작은 따옴표를 사용하고 있는데, 이는 보간이 없음을 의미합니다. echo '$(pwd)'
—— →$(pwd)
또한, 왜 이것이 작동하는지 설명했습니다. 왜 다른 기능을 PS1=$(pwd)
합니까? (견적 없음)
달리 말하면 따옴표를 사용하면 터미널을 탐색 할 때 프롬프트가 현재 디렉토리로 계속 변경됩니다. 그러나 따옴표를 사용하지 않으면 프롬프트는 항상 처음 명령을 입력했을 때 있던 디렉토리로 유지됩니다PS1=$(pwd)
왜?
답변
단순히 변수에 값을 할당 할 때 $(...)
작은 따옴표 (또는 백 슬래시 이스케이프)로 묶지 않으면 표현식이 평가됩니다. 이해하려면이 두 가지를 시도하고 비교하십시오.
A=$(pwd)
echo "$A"
B='$(pwd)'
echo "$B"
값은 A
즉시 문자열이 /home/yourusername
되며 분명히이 문자열의 출처를 기억하지 못하며 디렉토리를 변경하더라도 동일하게 유지됩니다. B
그러나 의 값은 $(pwd)
해석되지 않고 리터럴 문자열이됩니다 .
이제 PS1
특수한 값이 발생합니다. 프롬프트가 인쇄 될 때마다 특정 특수 구문이 해석됩니다. 예를 들어 명령 대체 $(...)
는 A
변수 할당에서 위와 동일한 방식으로 수행됩니다 . 분명히 PS1
홈 디렉토리의 리터럴 문자열이 (위와 같이 A
) 포함되어 있다면 변경할 수있는 방법이 없습니다. 그러나 문자열에 $(pwd)
위와 같이 문자열이 포함되어 있으면 B
프롬프트가 인쇄 될 때마다 평가되므로 실제 디렉토리가 표시됩니다.
답변
bash와 zsh에서 값은 PS1
그대로 프롬프트로 사용되지 않으며 일부 확장됩니다. 규칙은 두 개의 쉘 대해 다르지만, 두 경우 모두에서, 단계들 중 하나는 통상 셸 구문과 동일한 구문 “달러”확장 (가변 치환, 명령 치환, 산술 평가)를 수행한다 ( , , 또는 , , ) .$VARIABLE
${VARIABLE}
$(COMMAND)
`COMMAND`
$((EXPRESSION))
$[EXPRESSION]
- bash에서는 달러 확장이 기본적으로 켜져 있지만을 사용하여 끌 수 있습니다
shopt -u promptvars
. - zsh에서 달러 확장은 기본적으로 꺼져 있지만 많은 사람들 (및 웹에서 찾을 수있는 대부분의 구성 프레임 워크)은로 확장됩니다
setopt prompt_subst
.
온 프롬프트에 달러 팽창으로 PS1='$(pwd)'
세트 PS1
6 문자 값에 $(pwd)
따라서 발생 및 $(pwd)
치환되어야하고, 따라서 pwd
마다 새로운 셸 프롬프트 표시 명령이 실행된다. 반면에 당시 쉘의 현재 작업 디렉토리는 무엇이든 PS1=$(pwd)
설정 PS1
합니다. 달러 확장을 끈 PS1='$(pwd)'
경우 프롬프트가 리터럴 문자열이 $(pwd)
됩니다.
프롬프트에서 작업 디렉토리를 얻는 더 편리한 방법이 있습니다.
- 배쉬에서는,와 백 슬래시 이스케이프 등
\w
으로 홈 디렉토리를 abbreviates,~
및 설정에 의해 손질 할 수있다PROMPT_DIRTRIM
. - zsh을에서, 함께 %의 탈출 등
%/
또는%~
(%/
동일로$PWD
,%~
홈 디렉토리를 abbreviates) 트리밍 설정을 할 수있는. - 하나의 셸 (및 다른 Bourne 스타일 셸)
$PWD
은 다음과 같습니다$(pwd)
. 현재 작업 디렉토리를 얻기 위해 하위 프로세스를 실행할 필요가 없습니다.
답변
따옴표가 없기 때문에 $ (pwd)는 PS1이 설정 될 때 평가됩니다. 따옴표와 함께 $ (pwd)의 평가는 프롬프트가 표시 될 때까지 연기됩니다.
따옴표가 없으면 PS1이 설정 될 때 PS1이 현재 디렉토리로 설정됩니다. 작은 따옴표를 사용하면 PS1이 $ (pwd)로 설정됩니다. 즉, 프롬프트가 표시 될 때마다 현재 디렉토리를 평가하고 인쇄합니다.